2

文字列から 3 つのセグメントを抽出しようとしています。私は正規表現が特に得意ではないので、私がやったことはおそらくもっとうまくできると思います。

次の文字列の太字部分を抽出したいと思います。

SOMETEXT: ANYTHING_HERE (旧 = ANYTHING_HERE、新 = ANYTHING_HERE )

いくつかの例は次のとおりです。

ABC: Some_Field (旧=,新=123)

ABC: Some_Field (旧=ABCde,新=1234)

ABC: Some_Field (旧=Hello World、新=Bye Bye World)

したがって、上記は次の一致を返します。

$matches[0] = 'Some_Field';
$matches[1] = '';
$matches[2] = '123';

これまでのところ、次のコードがあります。

preg_match_all('/^([a-z]*\:(\s?)+)(.+)(\s?)+\(old=(.+)\,(\s?)+new=(.+)\)/i',$string,$matches);

上記の問題は、文字列の個別のセグメントごとに一致を返すことです。それが理にかなっている場合、一致をキャッチして保存せずに、正規表現を使用して文字列が正しい形式であることを確認する方法がわかりませんか?

それで、私の質問は、まだ明確でない場合、上記の文字列から必要なセグメントだけを取得するにはどうすればよいですか?

4

5 に答える 5

1

必要ありませんpreg_match_all。このpreg_match呼び出しを使用できます。

$s = 'SOMETEXT: ANYTHING_HERE (Old=ANYTHING_HERE1, New=ANYTHING_HERE2)';
if (preg_match('/[^:]*:\s*(\w*)\s*\(Old=(\w*),\s*New=(\w*)/i', $s, $arr))
   print_r($arr);

出力:

Array
(
    [0] => SOMETEXT: ANYTHING_HERE (Old=ANYTHING_HERE1, New=ANYTHING_HERE2
    [1] => ANYTHING_HERE
    [2] => ANYTHING_HERE1
    [3] => ANYTHING_HERE2
)
于 2013-10-23T15:58:59.210 に答える
1
if(preg_match_all('/([a-z]*)\:\s*.+\(Old=(.+),\s*New=(.+)\)/i',$string,$matches)) {
    print_r($matches);
}

例:

$string = 'ABC: Some_Field (Old=Hello World,New=Bye Bye World)';

一致します:

Array
(
    [0] => Array
        (
            [0] => ABC: Some_Field (Old=Hello World,New=Bye Bye World)
        )

    [1] => Array
        (
            [0] => ABC
        )

    [2] => Array
        (
            [0] => Hello World
        )

    [3] => Array
        (
            [0] => Bye Bye World
        )

)
于 2013-10-23T16:00:59.240 に答える
0
:\s*([^(\s]+)\s*\(Old=([^,]*),New=([^)]*)

ライブデモ

また、説明が必要な場合は言ってください。

于 2013-10-23T16:09:50.653 に答える