0

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

/(?:"\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 函数来运行它而不会出错,结果可以找到上面的例子。提前致谢。

4

3 回答 3

0

当使用括号作为文字时,您应该对其进行转义。所以而不是[+&!@(),.-]使用[+&!@\(\),.-]

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

编辑:刚刚做了一些阅读,并且按照大多数标准[+&!@(),.-]应该可以工作,因为括号括在括号中 - 但转义它们至少值得一试。

于 2013-11-11T09:02:05.647 回答
0

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

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

现在如果你看这部分["\\],第一个 \ 用于转义第二个 \ 。但是我明白当我使用 preg_match() 运行我的代码时,第二个 \ 将转义结束 ] 。这会导致错误!所以我通过在它之间放置一个空格来修复它["\\ ] 现在效果很好:

/(?:^["\\ ]*(?:[\d"]+|[^"]+")+\s*(?:n?and|x?or|not|\|\||\&\&)\s*[\w"[+&!@(),.-])/
于 2013-11-13T07:40:36.670 回答
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 错误

于 2013-11-11T04:42:09.160 回答