使用正则表达式解析php中的html字符串

时间:2013-02-19 21:50:15

标签: php html regex parsing

我想使用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]*会有什么不同?

1 个答案:

答案 0 :(得分: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>内。

这是因为*贪婪。它需要 max 可以匹配的字符数量。

要解决您的问题,您需要使用.*?。这使得它可以匹配最小字符数。

正则表达式/<i>.*?<\/i>/将按您的意愿运行。