[英]Find multiple patterns with a single preg_match_all in PHP
使用PHP和preg_match_all我試圖獲取以下標記之間的所有HTML內容(以及標記):
<p>paragraph text</p>
don't take this
<ul><li>item 1</li><li>item 2</li></ul>
don't take this
<table><tr><td>table content</td></tr></table>
我可以得到其中一個就好了:
preg_match_all("(<p>(.*)</p>)siU", $content, $matches, PREG_SET_ORDER);
有沒有辦法讓所有的
<p></p> <ul></ul> <table></table>
內容只有一個preg_match_all? 我需要它們按照它們被發現的順序出來,所以我可以回應內容,這將是有道理的。
所以,如果我在上面的內容上做了一個preg_match_all,那么迭代通過$ matches數組就會回顯:
<p>paragraph text</p>
<ul><li>item 1</li><li>item 2</li></ul>
<table><tr><td>table content</td></tr></table>
使用|
匹配一組字符串中的一個: p|ul|table
使用反向引用匹配approriate結束標記: \\\\2
因為組(pl|ul|table)
包含第二個左括號
把它們放在一起:
preg_match_all("(<(p|ul|table)>(.*)</\\2>)siU", $content, $matches, PREG_SET_ORDER);
如果您的輸入html遵循非常嚴格的結構,這只會起作用。 它不能在標記中包含空格,也不能在標記中包含任何屬性。 當有任何嵌套時它也會失敗。 考慮使用html解析器來做正確的工作。
這個對我有用
preg_match_all("#<\b(p|ul|table)\b[^>]*>(.*?)</\b(p|ul|table)\b>#si", $content, $matches)
如果您要使用DOM解析器,那么您應該如何使用它。 貢獻者發布了一個有用的函數來獲取DOMNode的innerHTML ,我將在下面的例子中使用它:
$dom = new DOMDocument;
$dom->loadHTML($html);
$p = $dom->getElementsByTagName('p')->item(0); // first <p> node
$ul = $dom->getElementsByTagName('ul')->item(0); // first <ul> node
$table = $dom->getElementsByTagName('table')->item(0); // first <table> node
echo DOMinnerHTML($p);
echo DOMinnerHTML($ul);
echo DOMinnerHTML($table);
雖然可以使用正則表達式,但您可以使用一個更簡單的HTML解析器工具包來簡化任務。 例如,使用phpQuery或QueryPath,它就像下面這樣簡單:
qp($html)->find("p, ul, table")->text(); // or loop over them
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.