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

时间:2016-03-04 10:48:12

标签: php regex

我有以下示例:

<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操作。

1 个答案:

答案 0 :(得分:1)

试试这个:

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

Regex Demo

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