2015-11-03 131 views
2

替換所有圖像,我有這個網站的內容:提取和段落

<p><img src="##" /> 
</p> 
<p> 

<img src="##" /> 
</p> 
<p> 
</p> 
<p class="ss"><a href="ss"> 
    <img src="####" /> 
</a></p> 

我想提取所有段落和所有的圖像,並重新格式化HTML,所以我可以有圖片先則如下因素的段落,這是一個例如:

<img src="##" /><p> 
</p> 
<img src="##" /> 
<p> 


</p> 
<p> 
</p> 
<img src="####" /> 
<p class="ss"><a href="ss"> 

</a></p> 

我試過的東西,但它不會工作:

$result = preg_replace('/(<p\b[^><]*)>(.+?)(<img([^>]*)\/>)(.+?)(<\/p>)/is', '$2 $4', $text); 
+0

這將很難做一個HTML解析器,更不用說使用正則表達式。 – sln

+0

這就是我想要的,只有正則表達式 –

+0

爲什麼要堅持正則表達式? [SimpleXML](http://us1.php.net/manual/en/book.simplexml.php)會更容易。 –

回答

0

這個工作對我來說,它看起來每個該段落包含任何內容和圖片,因此我可以匹配所有圖片及其包含的段落。

$pattern = '/(<p\b[^><]*>)(((?!<\/p>).?)*)(<img.*?\/\>)(((?!<\/p>).?)*)(<\/p>)/s'; 
+0

很好。小心解釋它做了什麼? – Machavity

0

這是非常粗糙,可以匹配更多的比你想要它,但在非常簡單的情況下,這可能工作:

$result = preg_replace('/(<p[^>]*>)(.*?)(<img[^>]*>)/is', '$3$1$2', $text); 

這可能是更好:

$result = preg_replace('/(<p[^>]*>)([^<]*)(<img[^>]*>)/is', '$3$1$2', $text); 
+0

它不會在另一個例子中檢查:https://regex101.com/r/aW6nX0/6 –

+0

似乎工作如何設計它。這並不是要在嵌套時拉動img標籤。它可以,但是它也會錯誤地拉出一些它不應該的圖像。我根據OP的例子做出的假設是,img標籤會立即跟隨p標籤打開,並且我只會拉動這些標籤。在你的例子中,你從一個錨標籤中拉出了一個img標籤,這會導致錨無用,img不可點擊。 –

+0

在這種情況下,您可能希望將錨標記和img標記同時從p中拉出來,但這不是他要求的 - 最好是安全,而不是在未定義的情況下修改源文件。 –