获取括号之间的所有文本,但跳过嵌套括号

时间:2019-03-21 14:45:30

标签: php regex regex-negation

我试图弄清楚如何在两个方括号标签之间获取文本,但不要在第一个结尾处停下来)

__('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') 

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用正则表达式子例程来匹配__之后的嵌套括号内的文本:

if (preg_match_all('~__(\(((?:[^()]++|(?1))*)\))~', $s, $matches)) {
    print_r($matches[2]);
}

请参见regex demo

详细信息

  • __-一个__子字符串
  • (\(((?:[^()]++|(?1))*)\))-第1组(将使用(?1)子例程递归):
    • \(-一个(字符
    • ((?:[^()]++|(?1))*)-第2组捕获了()以外的任何1个以上字符的0个或更多重复,或者整个第1组模式都被重现
    • \)-一个)字符。

请参见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 )

答案 1 :(得分:0)

您忘记在正则表达式中转义两个括号:__\((.*)\);

选中preview

答案 2 :(得分:0)

使用模式__\((.*)?\)

\会转义括号以捕获文字括号。然后,将捕获该括号内的所有文本。