PHP正则表达式,如果存在转义括号

时间:2015-10-22 19:28:57

标签: php regex escaping

在PHP中,我试图完成一个简单的任务,即使用preg_match_all从字符串中提取一些信息

我有一个这样的字符串,例如0(a)1(b)2(c)3(d)4(e)5(f)

并且我试图返回每个()内部的所有内容但是要尊重转义括号可能存在​​于其中的事实。

我尝试了多种组合,但我无法获得任何正则表达式以允许此4(here are some escaped parens\(\) more text)之类的内容返回此here are some escaped parens\(\) more text而不是此here are some escaped parens\(\)

我有一个正则表达式,但没有转义括号

[0-9]*\(([^ESCAPED PARENTHESIS])*?\)

有人可以告诉我如何实现这个目标吗?

4 个答案:

答案 0 :(得分:2)

您可以使用negative look behind使您的正则表达式引擎与不带反斜杠的前括号匹配:

.price {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}

参见演示https://regex101.com/r/oU9sF2/1

Regular expression visualization

Debuggex Demo

答案 1 :(得分:1)

您可以使用此正则表达式匹配您的文字:

preg_match_all('/(?<!\\)\((.*?)(?<!\\)\)/', $str, $matches);

print_r($matches[1]);

RegEx Demo

答案 2 :(得分:1)

这是一个有效的正则表达式:

[0-9]*\(([^()\\]*(?:\\.[^()\\]*?)*)\)

请参阅regex demo

请参阅IDEONE demo

$re = '~[0-9]*\(([^()\\\\]*(?:\\\\.[^()\\\\]*?)*)\)~s'; 
$str = "0(a)1(b)2(c)3(d)4(here are some escaped parens\(\) more text)5(f)"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

正则表达式细分:

  • [0-9]* - 匹配0位或更多位数
  • \( - 匹配文字(
  • ([^()\\]*(?:\\[()][^()]*?)*) - 匹配和捕获
    • [^()\\]* - 除\()
    • 以外的0个或多个符号
    • (?:\\.[^()]*?)* - 匹配0个或更多个序列...
      • \\. - 转义字符后跟
      • [^()\\]*? - 除\()以外的其他字符
  • \) - 匹配文字)

答案 3 :(得分:1)

您可以使用此模式:

$pattern = <<<'EOD'
~[0-9]+\([^)\\]*+(?s:\\.[^)\\]*)*+\)~
EOD;

demo

这个想法是匹配所有字符,直到右括号和反斜杠。当达到反斜杠时,下一个字符也匹配,并且“und so weiter”等等,直到世界末尾(或右括号),所有不是右括号或反斜杠的字符都匹配。

注意:占有量词*+仅限于在没有右括号时限制回溯。

相关问题