给定一个具有多个无序列表的页面,如何使用单个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',
)
*/