2016-03-04 67 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