Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 编译失败:偏移量处的括号不匹配(常规Exp)_Php_Regex_Preg Match - Fatal编程技术网

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是的,我用单引号,因为如果我用双引号,正则表达式将不起作用,因为它包含很少的双引号…我实际上没有里德说,但避开括号并不能解决问题。这确实是一个非常奇怪的问题