我试图找出如何在两个括号标签之间获取文本,但不要在第一次关闭时停止)
__('This is a (TEST) all of this i want') i dont want any of this;
我目前的模式是__\((.*?)\)
这给了我
__('This is a (TEST)
但我想要
__('This is a (TEST) all of this i want')
谢谢
你忘了在正则表达式中删除两个括号:__\((.*)\)
;
检查regex101.com。
在__
之后,您可以使用正则表达式子例程来匹配嵌套括号内的文本:
if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
print_r($matches[2]);
}
细节
__
- 一个__
子串(\(((?:[^()]++|(?1))*)\))
- 第1组(将使用(?1)
子例程递归):
\(
- (
char
((?:[^()]++|(?1))*)
- 第2组捕获除(
和)
之外的任何1+字符的0次或多次重复或整个第1组模式被递归
\)
- )
char。见PHP demo:
$s = "__('This is a (TEST) all of this i want') i dont want any of this; __(extract this)";
if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
print_r($matches[2]);
}
// => Array ( [0] => 'This is a (TEST) all of this i want' [1] => extract this )
使用模式__\((.*)?\)
。
\
逃脱括号以捕捉字面括号。然后,它会捕获该组括号内的所有文本。