Удалять якоря до их содержимого, только если URL якоря содержит - PullRequest
1 голос
/ 12 марта 2010

Кто-нибудь знает функцию регулярного выражения в PHP для удаления привязки его содержимого, только если атрибут привязки href содержит определенный текст?

Например, у меня есть HTML-страница и ссылки по всему. Но я хочу удалить только те якоря, которые содержат «Yahoo» в URL. Таким образом, <a href="http://pages.yahoo.com/page1">Example page</a> станет: Пример, тогда как другие якоря в HTML, не содержащие «yahoo», будут оставлены в покое.

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

Во-первых, это не проблема регулярных выражений (или, по крайней мере, не должно быть). 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() здесь необязательно. Вы можете просто проверить, содержит ли значение атрибута «yahoo» где-либо в нем, не вытаскивая только имя хоста.

Это значительно лучше и надежнее, чем любое решение на основе регулярных выражений для той же проблемы.

0 голосов
/ 08 сентября 2010

Попробуйте эту функцию.

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);

Если вы хотите, чтобы он игнорировал ссылки Yahoo, назовите его так: stripAnchorTags ($ html, "yahoo");

...