在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])*?\)
有人可以告诉我如何实现这个目标吗?
答案 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
答案 1 :(得分:1)
您可以使用此正则表达式匹配您的文字:
preg_match_all('/(?<!\\)\((.*?)(?<!\\)\)/', $str, $matches);
print_r($matches[1]);
答案 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个或更多个序列...
\\.
- 转义字符后跟[^()\\]*?
- 除\
,(
和)
以外的其他字符\)
- 匹配文字)
答案 3 :(得分:1)
您可以使用此模式:
$pattern = <<<'EOD'
~[0-9]+\([^)\\]*+(?s:\\.[^)\\]*)*+\)~
EOD;
这个想法是匹配所有字符,直到右括号和反斜杠。当达到反斜杠时,下一个字符也匹配,并且“und so weiter”等等,直到世界末尾(或右括号),所有不是右括号或反斜杠的字符都匹配。
注意:占有量词*+
仅限于在没有右括号时限制回溯。