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 回答