我想使用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]*
会有什么不同?
答案 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>/
将按您的意愿运行。