簡體   English   中英

在PHP中使用單個preg_match_all查找多個模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM