“preg_match():编译失败:PHP中无效的括号”表示有效模式

时间:2012-04-30 13:51:53

标签: php regex preg-match

想知道在PHP的preg_match函数中使用时,是否有人可以解释为什么以下正则表达式失败: -

<?php
$str = '\tmp\phpDC1C.tmp';

preg_match('|\\tmp\\([A-Za-z0-9]+)|', $str, $matches);

print_r($matches);
?>

这导致错误消息“preg_match():编译失败:不匹配的括号”,尽管该模式似乎是有效的。我用在线PHP Regular Expression tester和Linux工具Kiki测试了它。好像PHP正在逃避左括号而不是反斜杠。

我已经解决了这个问题,使用str_replace来交换前向的反斜杠。这适用于我的情况,但很高兴知道为什么这个正则表达式失败。

4 个答案:

答案 0 :(得分:18)

要对文字反斜杠进行编码,您需要将其转义两次:一次为字符串,一次为正则表达式引擎:

preg_match('|\\\\tmp\\\\([A-Za-z0-9]+)|', $str, $matches);

在PHP中(使用单引号字符串时),这仅与实际反斜杠有关;其他正则表达式转义只需一个反斜杠即可:

preg_match('/\bhello\b/', $subject)

the manual中介绍了这一点(请参阅页面顶部标有“注意:”的方框)。

答案 1 :(得分:1)

你必须使用|\\\tmp\\\([A-Za-z0-9]+)|表达式

但是由于具体的字符串形式,有更好的方法来获取文件名。例如:

substr($str, 5, -4);

考虑内存使用情况

答案 2 :(得分:0)

奇怪我刚刚使用您提到的相同的在线正则表达式测试程序进行了测试,并且编译时没有错误:

<?php 
$ptn = "/<;?php $str = '\tmp\phpDC1C.tmp'; 
preg_match('|\\tmp\\([A-Za-z0-9]+)|', $str, $matches); print_r($matches); ?>;/";
$str = "";
preg_match($ptn, $str, $matches);
print_r($matches);
?>

答案 3 :(得分:0)

使用下一个正则表达式:

php >$str = '\tmp\phpDC1C.tmp'; 
php >preg_match('/[\\\\]tmp[\\\\]([A-Za-z0-9]+)/', $str, $matches);
php >print_r($matches);
Array
(
  [0] => \tmp\phpDC1C
  [1] => phpDC1C
)