1

例えば、<a href="http://msdn.microsoft.com/art029nr/">remove links to here but keep text</a> but <a href="http://herpyderp.com">leave all other links alone</a>

私はpreg_replaceを使用してこれを解決しようとしてきました。ここを検索して、問題の一部を解決する答えを見つけました。

PHPでの答え:テキストから特定のドメインのすべてのハイパーリンクを削除すると、特定のURLへのリンクが削除されますが、テキストも削除されます。

http://php-opensource-help.blogspot.ie/2010/10/how-to-remove-hyperlink-from-string.htmlのサイトでは、文字列からハイパーリンクが削除されていますが、パターンを変更できないようです。特定のWebサイトにのみ適用されるようにします。

4

1 に答える 1

5
$html = '...I can haz HTML?...';
$whitelist = array('herpyderp.com', 'google.com');

$dom = new DomDocument();
$dom->loadHtml($html);    
$links = $dom->getELementsByTagName('a');

foreach($links as $link){
  $host = parse_url($link->getAttribute('href'), PHP_URL_HOST);

  if($host && !in_array($host, $whitelist)){    

    // create a text node with the contents of the blacklisted link
    $text = new DomText($link->nodeValue);

    // insert it before the link
    $link->parentNode->insertBefore($text, $link);

    // and remove the link
    $link->parentNode->removeChild($link);
  }  

}

// remove wrapping tags added by the parser
$dom->removeChild($dom->firstChild);            
$dom->replaceChild($dom->firstChild->firstChild->firstChild, $dom->firstChild);

$html = $dom->saveHtml();

preg_replaceパフォーマンス上の理由で代わりにDomDocumentを使用するのが怖い人のために、これとQでリンクされたコード(リンクを完全に削除するコード)の間で簡単なテストを行いました=>DomDocumentはわずか約4倍遅くなります。

于 2013-02-11T00:31:42.100 に答える