编译失败:偏移处的括号不匹配(常规 Exp)


Compilation failed: unmatched parentheses at offset (Regular Exp)

我是正则表达式的初学者。我有以下正则表达式:

/(?:"'s*or's*"?'d)|(?:''x(?:23|27|3d))|(?:^.?"$)|(?:(?:^["'']*(?:['d"]+|[^"]+"))+'s*(?:n?and|x?or|not|'|'||'&'&)'s*['w"[+&!@(),.-])|(?:[^'w's]'w+'s*[|-]'s*"'s*'w)|(?:@'w+'s+(and|or)'s*["'d]+)|(?:@['w-]+'s(and|or)'s*[^'w's])|(?:[^'w's:]'s*'d'W+[^'w's]'s*".)|(?:'Winformation_schema|table_name'W)'

当我在这里运行这个正则表达式时,它运行良好。但是当我使用 preg_match 在我的 php 脚本中运行它时,它会显示

Warning: preg_match(): Compilation failed: unmatched parentheses at offset 129 in...

这些是我需要这个正则表达式找到它们的模式的几个示例:

"' 26" && [
"' 26" && +
"' 26" && &
"' 26" && !
"' 26" && @
"' 26" && (
"' 26" && )

我不想更改正则表达式的结构,我需要知道一个 PHP 函数才能运行它而不会出错,结果可以找到上面的例子。提前谢谢。

所以我做了一些试验和错误。我不是正则表达式方面的专家,但我确实缩小了一些范围。你有很多OR语句(str1)|(str2)所以我开始剪掉字符串,直到 PHP 扔掉一个

preg_match('/(?:(?:^["'']*(?:['d"]+|[^"]+"))+'s*(?:n?and|x?or|not|'|'||'&'&)'s*['w"[+&!@(),.-])/', $str, $matches);

这产生了Compilation failed: unmatched parentheses at offset 80.所以我们有我们的罪魁祸首。但原因有点难以捉摸。我把它弹出到 http://regex101.com,它没有显示任何问题,但 PHP 在你的角色类中丢失了它['w"[+&!@(),.-]

我只能告诉你,我在模式的开头添加了另一个括号,它有效......有点

$str = '"' 26" && [';
preg_match('/((?:(?:^["'']*(?:['d"]+|[^"]+"))+'s*(?:n?and|x?or|not|'|'||'&'&)'s*['w"[+&!@(),.-])/', $str, $matches);
var_dump($matches);

熄灭

array(2) {
  [0]=>
  string(11) ""' 26" && ["
  [1]=>
  string(11) ""' 26" && ["
}

它可能需要更多的调试,但我不能说正则表达式本身有什么问题。也许尝试打开一个PHP错误?

使用括号作为文字时,您应该对其进行转义。因此,与其使用[+&!@(),.-] [+&!@'('),.-]

使用未转义括号时的行为因正则表达式-enigne和正则表达式引擎而异,因此可以解释regex101和php之间的区别。

编辑:刚刚做了一些阅读,按照大多数标准,[+&!@(),.-]应该可以工作,因为括号括在括号中 - 但至少值得一试。

我找到了问题所在。这是我的正则表达式:

/(?:^["'']*(?:['d"]+|[^"]+")+'s*(?:n?and|x?or|not|'|'||'&'&)'s*['w"[+&!@(),.-])/

现在如果你["'']看这部分,第一个''是用来转义第二个''的,但是当我使用preg_match()运行代码时,我明白了第二个''将转义结束]。这会导致错误!所以我通过在["'' ]之间放置一个空格来修复它现在它运行良好:

/(?:^["'' ]*(?:['d"]+|[^"]+")+'s*(?:n?and|x?or|not|'|'||'&'&)'s*['w"[+&!@(),.-])/