如何使用正则表达式解析HTML标签?

3
我希望你能翻译以下通过正则表达式通过curl检索到的html标签内容。
<span class='ui-allscores'>IND - 203/9 (49.4 Ovs)</span>

这样输出将会是"IND - 203/9 (49.4 Ovs)"

我已经编写了下面的代码,但它没有起作用。

$one="<span class='ui-allscores'>IND - 203/9 (49.4 Ovs)</span>";
$five="~(?<=<span class='ui-allscores'>)[.]*(?=</br></span>)~";
preg_match_all($five,$one,$ui);
print_r($ui);

6
我不建议使用正则表达式解析HTML(参见)。 - federico-t
这则评论真的不太有用。当然可以使用正则表达式来解析上述HTML代码。它完全能胜任这个任务。 - Thoracius Appotite
@ThoraciusAppotite:正如您所看到的,有几个人将federico-t上面的评论标记为有用。 - Pierre François
3个回答

7
尝试这个:
$string = "<span class='ui-allscores'>IND - 203/9 (49.4 Ovs)</span>";

动态span标签:

preg_match('/<span[^>]*>(.*?)<\/span>/si', $string, $matches);

具体的跨度标签:

preg_match("/<span class='ui-allscores'>(.*?)<\/span>/si", $string, $matches);

// Output
array (size=2)
  0 => string '<span class='ui-allscores'>IND - 203/9 (49.4 Ovs)</span>' (length=56)
  1 => string 'IND - 203/9 (49.4 Ovs)' (length=22)

感谢大家解决我的问题。 - viki
某些解释可能会有帮助 - Reign.85

1
您的正则表达式问题在于[.]部分。这只匹配一个字面上的.,因为点号写在了字符类内。所以只需删除方括号即可。
 $five="~(?<=<span class='ui-allscores'>).*(?=</br></span>)~";

接下来的问题是 * 的贪心匹配。你可以在后面加上一个 ? 来改变此匹配行为。贪心匹配
$five="~(?<=<span class='ui-allscores'>).*?(?=</br></span>)~";

但总的来说:您最好使用HTML解析器来完成这项工作!请参见如何在PHP中解析和处理HTML/XML?

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接