1

php(単純な数値マッチング)を使用してhtml文字列を解析したいと思います。

<i>1002</i><i>999</i><i>344</i><i>663</i>

結果を配列として表示したい。例:[1002,999,344,633,...] 私はこのように試しました:

<?php
    $html="<i>1002</i><i>999</i><i>344</i><i>663</i>";
    if(preg_match_all("/<i>[0-9]*<\/i>/",$html, $matches,PREG_SET_ORDER))
        foreach($matches as $match) {
            echo strip_tags($match[0])."<br/>";
        }
?>

そして私は私が望む正確な出力を得ました。

1002
999
344
663

しかし、正規表現に小さな変更を加えて同じコードを試してみると、異なる答えが得られます。

このような:

<?php
    $html="<i>1002</i><i>999</i><i>344</i><i>663</i>";
    if(preg_match_all("/<i>.*<\/i>/",$html, $matches,PREG_SET_ORDER))
        foreach($matches as $match) {
            echo strip_tags($match[0])."<br/>";
        }
?>

出力:

1002999344663

(正規表現は文字列全体と一致しました。)

今、私はなぜ私がこのようになっているのか知りたいですか?.*代わりに(ゼロ以上)を使用した場合の違いは何[0-9]*ですか?

4

1 に答える 1

1

.*正規表現のは任意の文字に一致します([0-9]*数字にのみ一致し、数字で</i><i>はありません)。正規表現の/<i>.*<\/i>/一致:

<i>1002</i><i>999</i><i>344</i><i>663</i>
^ from here ------------------- to here ^

以来、文字列全体が。の中にあり<i></i>ます。

*貪欲だからです。一致できる文字の最大数が必要です。

問題を解決するには、を使用する必要があります.*?。これにより、一致できる文字の最小数が必要になります。

正規表現/<i>.*?<\/i>/は必要に応じて機能します。

于 2013-02-19T22:05:37.120 に答える