正则表达式以匹配未被标签包围的标签


Regex to match Tags NOT surrounded by Tags

我有以下示例:

<p>skljklf askjas</p>
<li>dsjd sjg</li> <li>skdkgds</li>
<li>skask las</li>
<p>skklgs aklgas</p>
<ul><li>saks </li><li>isksa</li></ul>
<li>asjkafsklj  asjlkafs</li>

如您所见,有 li 标签没有被ul包围。我正在尝试找到一个正则表达式,它可以选择<li>...</li><li>...</li>的所有出现并用<ul></ul>包围它们。所以最后我会有以下文字:

<p>skljklf askjas</p>
<ul><li>dsjd sjg</li> <li>skdkgds</li>
<li>skask las</li></ul>
<p>skklgs aklgas</p>
<ul><li>saks </li><li>isksa</li></ul>
<ul><li>asjkafsklj  asjlkafs</li></ul>

preg_replacemb_ereg_replace 在 php 中尝试它,但还没有真正的线索我可以如何开始。

我不想用DOMDocument做 DOM 操作.

试试这个:

(?<!<ul>)(?<!<'/li>)((?:'s*'n*<li>[^<]*<'/li>'s*'n*)+)(?<!<li>)(?!<'/ul>)

正则表达式演示

$re = "/(?<!<ul>)(?<!<''/li>)((?:<li>[^<]*<''/li>''s*''n*)+)(?<!<li>)(?!<''/ul>)/"; 
$str = "<p>skljklf askjas</p>'n<li>dsjd sjg</li> <li>skdkgds</li>'n<li>skask las</li>'n<p>skklgs aklgas</p>'n<ul><li>saks </li><li>isksa</li></ul>'n<li>asjkafsklj  asjlkafs</li>"; 
$str = preg_replace($re, '<ul>$0</ul>', $str);