如何在括号之间获取所有内容,但只包括那些未包含在括号中的内容

时间:2016-06-29 15:35:25

标签: php regex

到现在为止,我正在使用正则表达式:'/{(.*?)}/'将所有内容放在卷曲的barackets中,如:'abc {get me} def {and get me}'这样可以正常工作。

现在我正在寻找一种排除括号的方法,括号本身被括号括起来。字符串应该是不言自明的:'abc {get me {!but not me!}} def {and get {!but not me again!} me} ghi'

以下代码应说明我的需求......

<?php
$regex  = '/{(.*?)}/';
$string = 'abc {get me {!but not me!}} def {and get {!but not me again!} me} ghi';
preg_match_all( $regex, $string, $matches );
print_r( $matches[1] );
?>

打印:

Array
(
    [0] => get me {!but not me!
    [1] => and get {!but not me again!
)

但应该是:

Array
(
    [0] => get me {!but not me!}
    [1] => and get {!but not me again!} me
)

到目前为止,我无法通过Google找到解决方案,并期待在SO上找到解决方案。

问候

修改 Actually a very similar question was asked and answered on SO.但是如果你不熟悉正则表达式,很难从包装(...)更改为 {...} 。因此,您不能简单地采用答案给出的一种模式(请参阅上面的链接)并搜索 - 替换所有&#39;(&#39;&amp;&#39;)&#39;用&#39; {&#39; &安培; &#39;}&#39 ;.你真的必须了解那里发生了什么。

但如果你理解这种模式足以自定义它,你可能可以自己编写它......

2 个答案:

答案 0 :(得分:2)

你需要一个 recursive regex 一个捕获组来捕获大括号内的内容:

{((?:[^{}]++|(?R))*)}

<强>解释

  • { - 文字{(在PHP PCRE中,您无需转义此字符)
  • ( - 开始捕获组1
    • (?:[^{}]++|(?R))* - 除(?:...)*{以外的1 +个字符的零个或多个序列(请参阅})(请参阅[^{}]++)或整个模式(?R)是整个模式的占位符,如(?0)子例程调用)
  • ) - 第1组结束
  • } - 关闭文字}

请参阅regex demoPHP demo

$re = '~{((?:[^{}]++|(?R))*)}~'; 
$str = "abc {get me {!but not me!}} def {and get {!but not me again!} me} ghi"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

答案 1 :(得分:0)

这是一个使用变量左右分隔符生成正则表达式模式的脚本。

$delimiter_wrap  = '~';
$delimiter_left  = '{';/* put YOUR left delimiter here.  */
$delimiter_right = '}';/* put YOUR right delimiter here. */

$delimiter_left  = preg_quote( $delimiter_left,  $delimiter_wrap );
$delimiter_right = preg_quote( $delimiter_right, $delimiter_wrap );
$pattern         = $delimiter_wrap . $delimiter_left
                 . '((?:[^' . $delimiter_left . $delimiter_right . ']++|(?R))*)'
                 . $delimiter_right . $delimiter_wrap;

/* Now you can use the generated pattern. */
preg_match_all( $pattern, $subject, $matches );

致谢:谢谢@Wiktor Stribiżew谁写了我接受的答案......