正则表达式匹配的标签不按标签
问题描述:
我有以下的例子所包围:正则表达式匹配的标签不按标签
<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_replace
和mb_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);
相关http://*.com/questions/33903256/match-unclosed-html-tags-using-regex-and-php? – starkeen
@starkeen tim007已经找到了正则表达式的解决方案 – mansur
正则表达式是这个工作的错误工具,使用正则表达式来解析HTML只会推迟和放大你的痛苦。 – zzzzBov