我是正则表达式的初学者。我有以下正则表达式:
/(?:"\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函数来运行它而没有错误,结果可以找到上面的例子。 提前谢谢。
答案 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"[+&!@(),.-])/