正则表达式匹配只有一个子元素的无序列表

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);

Demo

此代码解析 HTML 本身并获取所有 <li> 元素,然后简单地计算它们。