我是正则表达式的初学者。我有以下正则表达式:
/(?:"'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"[+&!@(),.-])/