摆脱花括号外的任何东西

时间:2012-08-03 07:09:30

标签: php regex

我需要在php中使用正则表达式,允许以下内容:

这是给定的例子
1. aaa aaa {bb b {c cc} {d dd} e ee} xxx
2. 123 {asd {asd {asd {asd} asd}} asd} qwe

输出将是:
1. {bb b {c cc} {d dd} e ee}
2. {asd {asd {asd {asd} asd}} asd}

我尝试了这个但是不起作用

preg_match_all('/{(.*?)}/', $resonse, $matches);

它基本上摆脱了主要花括号之外的任何事情。在它内部有花括号。我真的需要你的帮助。非常感谢。

5 个答案:

答案 0 :(得分:3)

您需要PCRE的递归功能才能执行此操作。

<?php
$pattern = '!
  { # patterns start with curly brace
      (?:           # ?: means that this is only for grouping, not for capturing
                    # the { } contain 
        [^{}]*      # not-curly-braces-characters
      |             # or
        (?R)        # this pattern again, i.e. {^[{}] | (?R) } again
      )*
  } # patterns ends with curly brace
!x';

foreach( array('aaa aaa{bb b {c cc}{d dd}e ee}xxx', '123{asd{asd{asd{asd}asd}}asd}qwe') as $subject ) {
    echo "\n$subject: ";
    if ( preg_match($pattern, $subject, $m) ) {
        echo $m[0];
    }
    else {
        echo '--no match--';
    }
}

打印

aaa aaa{bb b {c cc}{d dd}e ee}xxx: {bb b {c cc}{d dd}e ee}
123{asd{asd{asd{asd}asd}}asd}qwe: {asd{asd{asd{asd}asd}}asd}

答案 1 :(得分:2)

你根本不需要正则表达式:

$str = 'aaa aaa{bb b {c cc}{d dd}e ee}xxx';

$replace = substr(substr($str, 0, strrpos($str, '}') + 1), strpos($str, '{'));

echo $replace; // displays "{bb b {c cc}{d dd}e ee}"

如果您对这段代码进行基准测试,它可能比正则表达式快得多。你不应该使用复杂的东西来做这么简单的事情。

我想你可能想要匹配每个字符串的多个结果。在这种情况下,我仍然可能有一个不依赖任何模块的更快的解决方案:

$str = 'aaa aaa{bb b {c cc}{d dd}e ee}xxxaaa qaaa{bb b {cqwe cc}{d cdd}e qweee}xxx';
$array = str_split($str);
$opens = 0;
$result = '';

$results = array();

for($i = 0; $i < count($array); $i++) {
    if($array[$i] === '{') {
        $opens++;
    } else if($array[$i] === '}' && $opens > 0) {
        $opens--;
    }

    if($opens > 0) $result .= $array[$i];

    if($opens === 0 && strlen($result) > 0) {
        $results[] = $result . '}';
        $result = '';
    }
}

print_r($results);

/*
results:
Array
(
    [0] => {bb b {c cc}{d dd}e ee}
    [1] => {bb b {cqwe cc}{d cdd}e qweee}
)

*/

答案 2 :(得分:0)

<?php
$str = "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz" ;

$str = preg_match("#\{((?>[^\{\}]+)|(?R))*\}#x", $str, $matches, PREG_OFFSET_CAPTURE, 3);

print_r($matches);
?>

答案 3 :(得分:0)

也许会这样做:preg_replace('/(^[^{]*)|([^}]*$)/', '', 'aaa aaa{bb b {c cc}{d dd}e ee}xxx');

答案 4 :(得分:0)

这真的是正则表达式的工作吗?通过查找第一个{和最后一个}来获取所需的子字符串似乎更容易。例如,这个:

$str = "abc {kjlj { jkljlkj } ljkj } kljlj";

$start = strpos($str, '{');  # First {
$end = strrpos($str, '}');   # Last }

$section = substr($str, $start, $end - $start + 1);
echo $section;  # => "{kjlj { jkljlkj } ljkj }"