1

次のような文字列があります: (...1 (...2 DS(...3 ( ...4 ) ) )

DS が終了する前に、DS の後の括弧の数がわからない場合に、DS の括弧内のデータを検索するための最良のアイデアはどれですか? (3, 4) そのような数学: 3 と 4 のブラケットで ds を乗算します。

4

4 に答える 4

4

正規表現ではできません。それは通常の言語ではありません。その一般的な解析。

$data  = '(...1 (...2 DS(...3 ( ...4 ) 5) )6 )';
$num   = array();
$start = strpos($data, 'DS') + strlen('DS');
$end   = strlen($data) - 1;
$paren = 0;
for ($i = $start;$i <= $end;$i++) {
    $n = $data[$i];
    if ($n == '(') $paren++;
    if ($n == ')') $paren--;
    if ($paren >= 0 && is_numeric($n)) {
        $num[] = $n;
    }
}
print_r($num);

出力

Array
(
    [0] => 3
    [1] => 4
    [2] => 5
)
于 2012-04-07T06:40:33.607 に答える
3

正規表現を使用することはできません。正規表現は、開き括弧の数を保存できません...

phpでコーディングする必要があります。

于 2012-04-07T06:35:58.727 に答える
0

これはそれで動作しますか?

preg_match_all('/DS\(...(\d)+ \)?\(?[DS]?/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
于 2012-04-07T06:39:13.677 に答える
-1

関数 substr を使用して DS が発生する場所から部分文字列を取得し、そこからデータを取得します。データを取得するには、部分文字列を解析して開き括弧の数を保持するだけです。閉じ括弧が始まったら、それらの数を数えます。このカウントと前のカウントが等しくなったとき、データを取得したことになります。

于 2012-04-07T06:36:22.520 に答える