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

drm*_*nja 9 php regex preg-match

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

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

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

print_r($matches);
?>
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*ker 18

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

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

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

preg_match('/\bhello\b/', $subject)
Run Code Online (Sandbox Code Playgroud)

手册中对此进行了介绍(请参阅页面顶部标有"注意:"的方框).

  • 用单引号括起来,真的有必要转义两次吗? (2认同)