使用php的正则表达式匹配特定的HTML无序列表's项


Matching a specific HTML unordered list's items using PHP's regex

给定一个具有多个无序列表的页面,如何使用单个PHP的正则表达式提取单个列表的元素?

<html>
<head>
<title>A title</title>
</head>
<body>
<ul id="list1">
<li>Item 1</li>
<li>Item 2</li>
</ul>
<ul id="list2">
<li>Item 3</li>
<li>Item 4</li>
</ul>
</body>
</html>

如何提取字符串"Item 3"answers"Item 4"?

解决方案将是微不足道的,如果一个人首先提取list2中的所有文本-类似<ul>.*?</ul>,然后应用第二个正则表达式来提取各种<li> s的内容-类似<li>.*?</li>preg_match_all()。另外,也可以使用DOM。

然而,出于学习目的,我感兴趣的是如何使用单个正则表达式。

最好的解决方案是使用DOM解析工具,因为正则表达式不是解析HTML文件的好方法。

<?
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$lis = $xpath->query('//ul[@id="list2"]/li');
$text = array();
foreach ($lis as $li) {
    $text[] = $li->nodeValue;
}
var_export($text);
/*
array (
  0 => 'Item 3',
  1 => 'Item 4',
)
*/