2011-10-14 69 views
0

我正在開發一個移動網站,其內容來自外部XML,並且我遇到了標籤問題。它們帶有樣式屬性,我認爲在顯示內容之前,使用preg_replace可以輕鬆地清除它們。當在文本中找到一個img標籤時,問題就出現了......例如:"Hel<img .../>lo My name is Alfred<br/>"。如果我只擦除了style屬性(通常是display:float),那麼圖片就會破壞文本,使得閱讀變得很糟糕。PHP preg_replace替換img標籤並將它們在html文本中移動

我的解決辦法是:使用了preg_replace,我「乾淨」的所有圖像標記,但後來我需要這些標記並將它們放置在下<br/></p>等(每最終段落標記的)之後。我認爲這至少會使頁面更具可讀性和組織性。

問題:不知道如何獲取每一個img標籤的索引,就在我清理它之後,然後找到段落的下一個末尾來放置它。

示例 - >

之前:

Hell<img .../>o my name is Alfred.<br/> 
<p>I come <img .../>from England</p> 

後:預先

Hello my name is Alfred<br/> 
<img .../> 
<p>I come from England</p> 
<img .../> 

感謝。

編輯---

我的疑問是:如果我發現文本img標籤(<img />)(可能使用了preg_replace,因爲我首先需要找到一個img標籤,驗證其屬性,並改變它們如果需要的話),我如何獲得整個字符串中的索引(通過整個字符串,我的意思是將整個html文檔作爲字符串讀取),以便我可以將整個標記移動到段落的下一個末尾?

+0

使用'(。+?)'代替'...',你得到了一個正則表達式。用一個小小的努力就可以找到許多重複的東西,例如[php - 使用正則表達式從兩個字符串中提取](http://stackoverflow.com/questions/4753092/php-extracting-from-between-two-strings -using-regex),儘管許多正則表達式的答案最近已經被破壞了。 – mario

+0

嗨,感謝您的迴應,但帶點我不是指正則表達式。我試圖說圖像標籤可以有任何東西(這實際上並不重要,我的疑問)。 我的疑問是:如果我在文本中找到了一個img標籤(''),我如何獲得整個字符串中的索引,以便我可以將整個標籤移動到段落的下一個末尾? – cesrafa

+0

您是否一次更換一個段落或整個文件? –

回答

0

您不會從任何preg_函數獲取匹配的位置。另一方面,您可以使用preg_replace_callback進行替換,然後堆疊匹配以便後續打印。 實施例:

function noimages($match) 
{ 
    $stack = array(); 
    $img_regex = '%<img.*(/>|</img>)%ixU'; 
    $noimages = preg_replace_callback($img_regex, 
    function ($imgtag) use(&$stack) { array_push($stack, $imgtag[0]); return ''; }, 
    $match); 
    return array($noimages,$stack); 
} 

因此,例如:

$match = '<p>I'm not <img src="yyy.jpg"/> interested on this <img src="zzz.jpg"></img> issue </p>'; 
list($withoutimg, $imgs) = noimages($match); 

將返回$ withoutimg塊和與$ IMGS兩個IMG標籤陣列。