0

次のことを可能にする 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);

基本的に、メインの中括弧の外側にあるものはすべて削除しますが、中に中括弧があるとは限りません。私は本当にあなたの助けが必要です。本当にありがとう。

4

5 に答える 5

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}
于 2012-08-03T07:17:21.497 に答える
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}
)

*/
于 2012-08-03T07:21:29.513 に答える
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 }"
于 2012-08-03T07:32:24.600 に答える
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);
?>
于 2012-08-03T07:20:10.450 に答える
0

多分これでうまくいくでしょう:preg_replace('/(^[^{]*)|([^}]*$)/', '', 'aaa aaa{bb b {c cc}{d dd}e ee}xxx');

于 2012-08-03T07:20:21.050 に答える