2010-03-12 90 views
1

時,纔將錨點錨定到它們的內容。只有在錨點的href屬性包含特定文本的情況下,是否有人知道PHP中的正則表達式函數剝離其內容的錨點?僅當錨點的URL包含

例如,我有一個HTML頁面,整個鏈接都有。但我想剝離URL中包含「yahoo」的錨。因此<a href="http://pages.yahoo.com/page1">Example page</a>會變成:例如,HTML中不包含「雅虎」的其他錨將被單獨留下。

+1

對不起託尼,它會變成什麼樣子? – zellio 2010-03-12 07:27:04

+0

@Mimi:'Example'。 – kennytm 2010-03-12 13:39:13

+0

去與cletus。 – zellio 2010-03-12 16:36:55

回答

3

首先,這不是一個正則表達式問題(或者至少不應該是這樣)。 PHP自帶了一個HTML解析器,所以我會強烈推薦使用

當你使用它時,你只需要遍歷所有的錨標籤,檢查href屬性,並在必要時進行修改,然後將其保存回HTML。例如:

$dom = new DOMDocument; 
$dom->loadHTML($html); // $html as a string 
$anchors = $dom->getElementsByTagName('a'); 
for ($i=0; i<$anchors->length; $i++) { 
    $item = $anchors->item[$i]; 
    $href = $item->getAttribute('href'); 
    $host = parse_url($href, PHP_URL_HOST); 
    if (stripos($host, 'yahoo') !== false) { 
    $item->parentNode->removeChild($item); 
    } 
} 
$html = $dom->saveHTML(); 

使用parse_url()這裏是可選的。您可以簡單地檢查屬性值是否在其中的任何位置具有「雅虎」,而無需僅提取主機名。

這是顯着比同樣問題的任何基於正則表達式的解決方案更好和更強大。

+0

-1 |如果他想要永久更改文件,他會更好地使用強大的編輯器來完成這項工作。 – aefxx 2010-03-12 08:21:24

+0

好的,你的解決方案看起來不錯,但還有2個問題。 至於性能和內存使用情況,這與regex解決方案相比有多高效?似乎這個選項會有更多的開銷。 此外,我還沒有測試過,但在你的例子中,你似乎只是修改錨點的href屬性,而不是剝離它的標籤的錨點。 我仍然不知道這個正則表達式會是什麼,但我認爲preg_replace可以做到這一點。 – Tony 2010-03-12 19:09:26

+0

@Tony如果你是在渲染頁面的一部分,那麼網絡等待時間很可能是一個更大的工廠,除非你在一個非常大的文檔上這樣做。內存使用量與處理時間基本上是文檔大小的線性函數,因此可以很好地擴展。如果進入過度的回溯場景,則正則表達式可能更難以預測。 – cletus 2010-03-13 00:47:17

0

試試這個功能。

public function stripAnchorTags($html, $ignore_host = false, $charset="UTF-8"){ 
     $dom = new DOMDocument; 
     $dom->loadHTML('<?xml version="1.0" encoding="'.$charset.'"?>'.$html); // $html as a string 
     $anchors = $dom->getElementsByTagName('a'); 
     $length = $anchors->length; 
     for($i=0; $i<$length; $i++){ 
      $item = $anchors->item(0); 
      $href = $item->getAttribute('href'); 
      $host = parse_url($href, PHP_URL_HOST); 
      if(!$ignore_host || stripos($host, $ignore_host) === false) { 
       $item->parentNode->replaceChild($dom->createTextNode($href),$item); 
      } 
     } 
     return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveXML($dom->documentElement))); 
    } 

您可以像這樣使用stripAnchorTags($ html);

如果您希望它忽略雅虎鏈接,然後像這樣調用stripAnchorTags($ html,「yahoo」);