2

文字列からすべての一致を取得しようとしています:

$string = '[RAND_15]d4trg[RAND_23]';

次のように preg_match を使用します。

$match = array();
preg_match('#\[RAND_.*]#', $string, $match);

しかし、その後 $match 配列は次のようになります。

Array ( [0] => [RAND_15]d4trg[RAND_23] )

$match 配列の 2 つの個別の要素として両方の出現を取得するにはどうすればよいですか? 私はこのような結果を得たいです:

$match[0] = [RAND_15];
$match[1] = [RAND_23];
4

1 に答える 1

5

使用する ...

$match = array();
preg_match_all('#\[RAND_.*?]#', $string, $match);

... 代わりは。?修飾子はパターンを「遅延」させ、可能な限り短い部分文字列に一致させます。それがなければ、パターンは可能な限り最大の距離をカバーしようとし、技術的に[RAND_15]d4trg[RAND_23] パターンと一致します。

もう 1 つの方法は、否定された文字クラスと一致するように文字セットを制限することです。

$match = array();
preg_match_all('#\[RAND_[^]]*]#', $string, $match);

[^]]このようにして、文字クラスは最初の]シンボルで一致を停止するため、量指定子を遅延したものに変える必要はありません。

それでも、すべての一致をキャッチするには、preg_match_allの代わりに使用する必要がありpreg_matchます。これが違いを示すデモです。

于 2013-06-10T17:38:41.823 に答える