2009-09-13 172 views
0

我想用正則表達式來替換src html屬性。該HTML不是畸形的,幸運的是發生在數據庫中的所有頁面相同的形式 - 即替換HTML標籤中的圖像src?

<img src="http://x.y/z/1.png" /> 

我,如果有隻有一個頁面圖像工作正常代碼。我想知道替換多個圖像的最佳方法,因爲這將替換所有具有相同字符串的圖像標記。

$result = $s->db_query("SELECT reviewFullText as f FROM reviews WHERE reviewsID = 155"); 
while($row = mysql_fetch_array($result)) 
{ 
    $body = stripslashes(html_entity_decode($row['f'], ENT_NOQUOTES, "UTF-8")); 
    preg_match_all('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', $body, $matches); 
    for($i=0;$i<count($matches[0]);$i++) 
    { 
     $number = preg_replace("/[^0-9]/", '', $matches[0][$i]); 
     echo preg_replace('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', '<img src="http://x.y/a/' . $number . '.png"', $matches[0][$i]); 
    } 
} 

因此,如果頁面包含兩個文件,一個叫1.png和一個叫2.png腳本應該分析這些數字,並用不同的URL,如http://x.y/a/1.pnghttp://x.y/a/2.png替換它們。

我聽說preg_replace_callback是這樣做的最好方法,但我不知道如何得到這個工作......幫助!

+0

相似的問題到http://stackoverflow.com/questions/1416425/preg-replace-preg-match-for-href-in-html-link – TrueWill 2009-09-13 16:56:42

+0

可能的重複[你能提供一些例子,說明爲什麼它很難用正則表達式解析XML和HTML?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and -html-with-a-rege) – 2011-07-09 21:01:27

+0

[RegEx match open tags but XHTML self-contained tags]可能重複(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml- self-contained-tags) – 2011-09-15 14:08:18

回答

14

Don't use regular expressions for irregular languages like HTML。改爲使用parser。它會爲你節省很多時間和痛苦。

# Untested code: 
$xml = new SimpleXml($xmlString); 
foreach ($xml->xpath('//img') as $imgNode) { 
    $imgNode->addAttribute('src', "http://x.y/a/" . $imgNode->getAttribute('src')); 
} 
echo $xml->asXML(); 

請注意,您將需要像DOMDocument::loadHtml(),如果你的HTML不是XHTML(即有效的XML),但這個想法是一樣的。

+0

+1正則表達式完全不適合處理[X] [HT] ML。但是XPath不應該是「// img」嗎? DOM getElementsByTagName也可以正常工作。我不知道在整個文檔中'stripslashes(html_entity_decode())'應該在原始代碼中實現什麼;這隻會破壞文件。 – bobince 2009-09-13 14:42:19

+0

@bobince:感謝您指出'// img'錯誤。我認爲''stripslashes(...'部分是爲'消毒'的價值(這可能是一個很好的跡象表明,文件的存儲/檢索需要重新設計。) – soulmerge 2009-09-13 15:03:26

+0

-1忽略具體問題.. as一個規則你不想使用正則表達式,但他明確表示,他想要替換的所有元素看起來完全一樣,所以對於這種情況,正則表達式是一個更好的解決方案。 – amitkaz 2009-09-13 15:33:03

1

在您的正則表達式中添加全局替換標誌「g」。

「/ your_regex /我

由於soulmerge建議,因爲你的HTML不是畸形(我假定你的意思是格式良好的XML),XSLT轉換是改變的有效途徑你文檔中的任何內容您可以匹配@src屬性並根據您的要求對其進行修改。

如果您需要同時更改文檔的其他部分,您還可以匹配任何其他標籤/屬性。