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

时间:2013-11-11 04:03:45

标签: php regex preg-match

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

/(?:"\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)\

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

所以我做了一些试验和错误。我不是正则表达式的专家,但我确实缩小了一些。你有很多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 bug

答案 1 :(得分:0)

当使用括号作为文字时,你应该将其转义。因此,而不是[+&!@(),.-]使用[+&!@\(\),.-]

使用非转义括号时的行为不同于regex-enigne到regex-engine,这样可以解释regex101和php之间的区别。

编辑:只是做了一些阅读,大多数标准[+&!@(),.-]应该有效,因为括号括在括号中 - 但是逃避它们至少值得一试。

答案 2 :(得分:0)

我发现问题出在哪里。 这是我的正则表达式:

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

现在,如果你看一下这个部分["\\],第一个\是用于转义第二个\。但是我知道当我使用preg_match()运行我的代码时,第二个\将逃避关闭]。 这会导致错误! 所以我通过在["\\ ]之间加一个空格来修复它 现在它运作良好:

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