Как программно добавить rel = "external" к внешним ссылкам в строке HTML? - PullRequest
0 голосов
/ 10 апреля 2011

Как я могу проверить, являются ли ссылки из строковой переменной внешними?Эта строка является содержимым сайта (например, комментарии, статьи и т. Д.).

А если они есть, как мне добавить значение external к их атрибуту rel?И если у них нет этого атрибута, добавьте rel="external"?

Ответы [ 3 ]

6 голосов
/ 10 апреля 2011

Анализатор HTML подходит для фильтрации входных данных, но для изменения выходных данных вам понадобится производительность простого решения регулярных выражений. В этом случае регулярное выражение обратного вызова будет делать:

$html = preg_replace_callback("#<a\s[^>]*href="(http://[^"]+)"[^>]*>#",
     "cb_ext_url", $html);

function cb_ext_url($match) {
    list ($orig, $url) = $match;
    if (strstr($url, "http://localhost/")) {
        return $orig;
    }
    elseif (strstr($orig, "rel=")) {
        return $orig;
    }
    else {
        return rtrim($orig, ">") . ' rel="external">';
    }
}

Возможно, вам понадобятся более мелкие чеки. Но это общий подход.

2 голосов
/ 10 апреля 2011

Используйте синтаксический анализатор XML, например SimpleXML .Regex не предназначен для анализа XML / HTML, и вот идеальное объяснение того, что происходит, когда вы это делаете: RegEx соответствует открытым тегам, за исключением автономных тегов XHTML .

Разбор вводакак XML, используйте синтаксический анализатор, чтобы выбрать необходимые элементы, отредактируйте их свойства с помощью синтаксического анализатора и выплюните их обратно.

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


Вот мой способ сделать это (не проверял):

<?php

$xmlString = "This is where the HTML of your site should go. Make sure it's valid!";

$xml = new SimpleXMLElement($xmlString);

foreach($xml->getElementsByTagName('a') as $a)
{
  $attributes = $a->attributes();

  if (isThisExternal($attributes['href']))
  {
    $a['rel'] = 'external';
  }
}

echo $xml->asXml();

?>
1 голос
/ 10 апреля 2011

Может быть проще сделать что-то подобное на стороне клиента, используя jQuery:

<script type="text/javascript">
    $(document).ready(function()
    {
        $.each($('a'), function(idx, tag)
        {
            // you might make this smarter and throw out URLS like 
            // http://www.otherdomain.com/yourdomain.com
            if ($(tag).attr('href').indexOf('yourdomain.com') < 0)
            {
                $(tag).attr('rel', 'external');
            }
        });
    });
</script>

Тем не менее, как отмечает Крейг Уайт, это никак не влияет на SEO и не поможет пользователям с отключенным JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...