Php 编译失败:偏移量处的括号不匹配(常规Exp)
我是正则表达式的初学者。我有以下正则表达式:Php 编译失败:偏移量处的括号不匹配(常规Exp),php,regex,preg-match,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*
/(?:"\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)\
当我运行这个正则表达式时,它运行得非常好。但当我在php脚本中使用preg\u match运行它时,它会显示
警告:preg_match():编译失败:偏移量129处的括号不匹配…
下面是我需要这个正则表达式来查找它们的几个模式示例:
"\ 26" && [
"\ 26" && +
"\ 26" && &
"\ 26" && !
"\ 26" && @
"\ 26" && (
"\ 26" && )
我不想改变正则表达式的结构,我需要知道一个PHP函数来运行它而不会出错,结果可以找到上面的例子。
提前谢谢。所以我做了一些尝试和错误。我不是正则表达式的专家,但我确实缩小了范围。你有很多
或语句(str1)|(str2)
,所以我开始剪切字符串,直到PHP抛出一个
preg_match('/(?:(?:^["\\]*(?:[\d"]+|[^"]+"))+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])/', $str, $matches);
生成的编译失败:偏移量80处的括号不匹配。所以我们找到了罪魁祸首。但为什么有点难以捉摸。我将它弹出到中,它没有显示任何问题,但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" && ["
}
它可能需要更多的调试,但我不能说正则表达式本身有什么问题。当使用括号作为文本时,可以尝试打开?将其转义。因此,不要使用[+&!@(),.-]
而使用[+&!@\(\),.-]
使用未转义括号时的行为不同于正则表达式enigne和正则表达式引擎,因此可以解释正则表达式101和php之间的差异
编辑:刚刚阅读了一些内容,按照大多数标准,
[+&!@(),.-]
应该可以工作,因为括号被括在括号中,但至少值得一试。我发现问题出在哪里。
这是我的正则表达式:
/(?:^["\\]*(?:[\d"]+|[^"]+")+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])/
现在,如果你看一下这一部分,第一个\是用来转义第二个\的。然而,当我使用preg\u match()运行代码时,我明白了,第二个\将转义结束]。
这会导致错误!
因此,我通过在[“\\
]
现在它运行良好:
/(?:^["\\ ]*(?:[\d"]+|[^"]+")+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])/
首先,你的分隔符不一样。你从/
开始,但以\@Machavity结尾,我修正了它,但结果仍然一样!你用单引号来分隔这个正则表达式字符串吗?@HenriqueBarcelos是的,我用单引号,因为如果我用双引号,正则表达式将不起作用,因为它包含很少的双引号…我实际上没有里德说,但避开括号并不能解决问题。这确实是一个非常奇怪的问题