2010-08-18 172 views
1

我正在寫一個正則表達式查找/替換,它將在<span>尚不存在的文件中的每個<a href>中插入一個<span>。這將允許其他標記是在<a href><img><b>正則表達式匹配不包含其他標記的HTML標記

目前我有這個表達式:
查找:(<a[^>]+?style=".*?color:#(\w{6}).*?".*?>)(.+?)(<\/a>)
替換:'$1<span style="color:#$2;">$3</span>$4'

它的偉大工程,除非我跑過來相同的文件,它會在<span>中插入一個<span>,它會變得混亂。

目標示例:

我們希望它忽略這一點:
<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;"><span style="color:#bfbcba;">Howdy</span></a>

但不是這樣的:
<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;">Howdy</a>

或者這樣:
<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;"><img src="myimg.gif" />Howdy</a>

--EDIT- -

使用作爲意見建議的PHP DOM庫,這是我到目前爲止有:

$doc = new DOMDocument(); 
$doc->loadHTML($input); 
$tags = $doc->getElementsByTagName('a'); 
foreach ($tags as $tag) { 
    $spancount = $tag->getElementsByTagName("span")->length; 
    if($spancount == 0){ 
     $element = $doc->createElement('span'); 
     $tag->appendChild($element); 
    } 
} 

echo $doc->saveHTML();` 

目前,如果有一個錨內的跨度它會檢測,如果有,它會追加一個跨越到錨的內部,但是,我還沒有弄清楚如何獲得跨度內錨的原始內容。

+0

在哪語言?可能是Perl或PHP或Javascript? – 2010-08-18 15:54:01

+8

請勿使用正則表達式來匹配HTML。使用HTML解析器。 – 2010-08-18 15:54:07

+2

使用正則表達式來解析XML(HTML)是一個壞主意。使用HTML解析器。 – 2010-08-18 15:54:58

回答

4

不要爲此使用正則表達式,它不適用於HTML。

使用DOM庫和getElementsByTagName('a')然後遍歷每個錨點並查看它是否包含使用length屬性的getElementsByTagName('span')的子跨度元素。如果不是,則將appendChild或將firstChild的錨節點分配給您使用document.createElement('span')創建的新跨度。

編輯:至於抓住錨的內部HTML,如果有很多節點內,請嘗試使用此:

<?php 
function innerHTML($node){ 
    $doc = new DOMDocument(); 
    foreach ($node->childNodes as $child) 
    $doc->appendChild($doc->importNode($child, true)); 

    return $doc->saveHTML(); 
} 

$html = innerHTML($anchorRef); 

這也可以幫助你:Change innerHTML of a php DOMElement

+0

完全確認,正則表達式和html =壞。儘管我可能會使用一個html解析器,甚至爲了使用lynx的ppl而使用simplexml而不是javascript。 – Robin 2010-08-18 15:59:36

+0

感謝您的DOM建議。我已經開始使用PHP DOM(第一次了!),並且我有一段時間來整理如何獲取元素的內容:'my link'在這種情況下'我的鏈接',然後包裝在一個跨度。我沒有問題創建新的span元素,並追加它,但獲取''內的原始內容一直困擾着我。 – 2010-08-18 20:18:09

+0

那麼,如果你在你的原始答案中發佈了你的嘗試,那麼對我(和其他人)來說會更容易。 – 2010-08-18 20:22:00

相關問題