正则表达式匹配只有一个子元素的无序列表
Regex to match unordered list with only one child element
我尝试制作一个正则表达式,它只匹配带有一个 <li></li>
标记的多行列表元素。
例如:
<ul>
<li>
Test, Test
</li>
</ul>
这应该匹配,但是:
<ul>
<li>
Test, Test
</li>
<li>
Test, Test
</li>
</ul>
不应该。
我已经有了
<ul>(.*?)<li>(?!<li>)<\/li>(.*?)</ul>
但这根本没有匹配项。
有人知道如何实现吗?
Don't use regexes for parsing HTML。以下是没有正则表达式的方法:
$html = [
'<ul>
<li>
Test, Test
</li>
<li>
Test, Test
</li>
</ul>',
'<ul>
<li>
Test, Test
</li>
</ul>',
];
$previous_value = libxml_use_internal_errors(true);
$dom = new DOMDocument();
foreach($html as $list) {
$dom->loadHTML($list);
echo $dom->getElementsByTagName('li')->length . "\n";
}
libxml_clear_errors();
libxml_use_internal_errors($previous_value);
此代码解析 HTML 本身并获取所有 <li>
元素,然后简单地计算它们。
我尝试制作一个正则表达式,它只匹配带有一个 <li></li>
标记的多行列表元素。
例如:
<ul>
<li>
Test, Test
</li>
</ul>
这应该匹配,但是:
<ul>
<li>
Test, Test
</li>
<li>
Test, Test
</li>
</ul>
不应该。
我已经有了
<ul>(.*?)<li>(?!<li>)<\/li>(.*?)</ul>
但这根本没有匹配项。
有人知道如何实现吗?
Don't use regexes for parsing HTML。以下是没有正则表达式的方法:
$html = [
'<ul>
<li>
Test, Test
</li>
<li>
Test, Test
</li>
</ul>',
'<ul>
<li>
Test, Test
</li>
</ul>',
];
$previous_value = libxml_use_internal_errors(true);
$dom = new DOMDocument();
foreach($html as $list) {
$dom->loadHTML($list);
echo $dom->getElementsByTagName('li')->length . "\n";
}
libxml_clear_errors();
libxml_use_internal_errors($previous_value);
此代码解析 HTML 本身并获取所有 <li>
元素,然后简单地计算它们。