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


"preg_match(): Compilation failed: unmatched parentheses" in PHP for valid pattern

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

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

这会导致错误消息"preg_match():编译失败:括号不匹配",尽管该模式似乎有效。我已经用在线PHP正则表达式测试器和Linux工具Kiki对其进行了测试。似乎 PHP 正在转义左括号而不是反斜杠。

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

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

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

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

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

这在手册中有介绍(请参阅页面顶部标有"注意:"的框)。

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

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

substr($str, 5, -4);

考虑内存使用情况

奇怪,

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

<?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);
?>

使用下一个正则表达式:

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
)