2010-04-09 24 views
0

所以,我有一個正則表達式來搜索HTML標籤並稍微修改它們。它工作得很好,但我需要對我找到的最後一個HTML標籤做一些特殊的處理。不確定最好的方法來做到這一點。我正在考慮某種反向註冊前,但沒有找到一種方法來做到這一點。這裏是我到目前爲止的代碼:PHP正則表達式幫助 - 反向搜索?

$html = '<div id="test"><p style="hello_world">This is a test.</p></div>'; 

$pattern = array('/<([A-Z][A-Z0-9]*)(\b[^>]*)>/i'); 
$replace = array('<tag>'); 
$html = preg_replace($pattern,$replace,$html); 

// Outputs: <tag><tag>This is a test</p></div> 

我想一些特別的東西來代替的<tag>最後一次出現,比方說,<end_tag>

任何想法?

+0

我該怎麼生氣,如果我再次看到_that_鏈接;/ – user187291 2010-04-09 21:16:49

+0

需要注意的是HTML屬性值可以包含普通'> '人物。 – Gumbo 2010-04-09 21:21:33

+0

什麼? ......... – 2010-04-09 21:22:36

回答

0

如果我閱讀了這個權利,您想查找文檔中的最後一個結束標記。

您可以找到最後一次出現的</*>,它後面不再有'<>'字符。這將是最後一個標籤,假設所有剩餘的尖括號被編碼爲&lt;&gt;

<?php 
$html = '<div id="test"><p style="hello_world">This is a test.</p></div>'; 

// Outputs: 
// '<div id="test"><p style="hello_world">This is a test.</p></tag>' 
echo preg_replace('/<\/[A-Z][A-Z0-9]*>([^<>]*)$/i', '</tag>$1', $html); 

這將</tag>取代最後</div>,保護下面的最終收盤標籤的所有內容。

我不知道爲什麼你只想使用閉合標籤來做到這一點,就好像你改變它一樣,你也必須改變匹配的開始標籤。此外,這將無法找到最後一個自動關閉標記,如<img /><br />

0

我相信這個方法的工作方式相同@微薄的,但更簡潔:

<?php 
$html = '<div id="test"><p style="hello_world">This is a test.</p></div>'; 
$readmore = ' <a href="/foo/bar">Read More&hellip;</a>'; 

// Outputs: 
// '<div id="test"><p style="hello_world">This is a test.</p> <a href="/foo/bar">Read More&hellip;</a></div>' 
echo preg_replace('#</\w>\s*$#', $readmore .'$1', $html); 
?>