2016-03-04 94 views
-1

我有以下的例子所包围:正则表达式匹配的标签不按标签

<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

相关http://stackoverflow.com/questions/33903256/match-unclosed-html-tags-using-regex-and-php? – starkeen

+0

@starkeen tim007已经找到了正则表达式的解决方案 – mansur

+0

正则表达式是这个工作的错误工具,使用正则表达式来解析HTML只会推迟和放大你的痛苦。 – zzzzBov

回答

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

效果很好!谢谢! – mansur

+0

可惜它匹配一件东西太多:“

  • asd
  • aasdfgh
”:/ – mansur