0

これが私のコードです:

echo "<br />";
preg_match_all("|<[^>]+>.*</[^>]+>|U",
    "<b>example:</b><strong>this is a test</strong>",
    $out, PREG_PATTERN_ORDER);
print_r($out);
echo "<br />";

echo "<br />";
preg_match_all("|<[^>]+>.*</[^>]+>|",
    "<b>example:</b><strong>this is a test</strong>",
    $out, PREG_PATTERN_ORDER);
print_r($out);
echo "<br />";

わからないことがあります。正規表現の最後にUがある場合、どのような違いがありますか?

出力は次のとおりです。

配列([0] =>配列([0] =>例:[1] =>これはテストです))

配列([0] =>配列([0] =>例:これはテストです))

では、ここで実際に何が起こっているのでしょうか。貪欲なバージョンとその理由はどれですか?

4

1 に答える 1

2

Uは、正規表現を「貪欲ではない」と言います。貪欲とは、可能な限り一致させようとすることを意味しますが、「貪欲でない」とは、最小の一致のみを取ります。

したがって、貪欲な例では、あなたの試合は次のようになります。

<b>example:</b><strong>this is a test</strong>

htmlタグ"</b><strong>"は、出力するとき、またはpreg_matchによってすでに削除されていると思います。

対照的に、貪欲ではない人は、次のように照合することで、あなたが望むことを行います。

<b>example:</b>, <strong>this is a test</strong>

編集:

?を使用して同様の一致を達成するには できるよ:

preg_match_all("|<[^>/]+>.*?</[^>]+>|",
    "<b>example:</b><strong>this is a test</strong>",
    $out, PREG_PATTERN_ORDER);
print_r($out);

これは.*?、タグ間のコンテンツをできるだけ短く(貪欲ではない)に制限しようとするためです。そのため、再び2つの一致が発生します。

于 2013-01-23T17:50:41.907 に答える