2010-11-21 84 views
1

說我有以下鏈接:str_replace函數與正則表達式

<li class="hook"> 
     <a href="i_have_underscores">I_have_underscores</a> 
</li> 

我怎麼會,去掉下劃線只在文字,而不是在href?我已經使用str_replace,但是這將刪除所有下劃線,這是不理想的。

所以基本上我會留下這樣的輸出:

<li class="hook"> 
     <a href="i_have_underscores">I have underscores</a> 
</li> 

任何幫助,非常感謝

+0

*(相關)* [最佳方法來解析HTML(http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) – Gordon 2010-11-27 21:41:23

回答

2

DOMDocument解析HTML代替正則表達式更安全。試試這個代碼:

<?php 

function replaceInAnchors($html) 
{ 
    $dom = new DOMDocument(); 
    // loadHtml() needs mb_convert_encoding() to work well with UTF-8 encoding 
    $dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")); 

    $xpath = new DOMXPath($dom); 

    foreach($xpath->query('//text()[(ancestor::a)]') as $node) 
    { 
     $replaced = str_ireplace('_', ' ', $node->wholeText); 
     $newNode = $dom->createDocumentFragment(); 
     $newNode->appendXML($replaced); 
     $node->parentNode->replaceChild($newNode, $node); 
    } 

    // get only the body tag with its contents, then trim the body tag itself to get only the original content 
    return mb_substr($dom->saveXML($xpath->query('//body')->item(0)), 6, -7, "UTF-8"); 
} 

$html = '<li class="hook"> 
     <a href="i_have_underscores">I_have_underscores</a> 
</li>'; 
echo replaceInAnchors($html); 
6

可以使用HTML DOM parser來獲取標籤內的文本,然後在運行str_replace()功能結果。


使用DOM解析器我聯繫,這是因爲像這樣簡單:

$html = str_get_html(
    '<li class="hook"><a href="i_have_underscores">I_have_underscores</a></li>'); 
$links = $html->find('a'); // You can use any css style selectors here 

foreach($links as $l) { 
    $l->innertext = str_replace('_', ' ', $l->innertext) 
} 

echo $html 
//<li class="hook"><a href="i_have_underscores">I have underscores</a></li> 

就是這樣。

+0

謝謝,我應該看看網站的哪一部分? – 2010-11-21 19:12:46

+0

在頭版,你會想看看「下載和文檔」下的兩個鏈接 – BudgieInWA 2010-11-21 20:14:08

+0

它比方式的解決方案更慢(我的機器上30ms比1ms),這似乎是對我來說最好的方法(但是用' 「// text()[(ancestor :: a)]」'xPath query)。 – 2010-11-21 22:21:45