如何以编程方式将rel =“external”添加到HTML字符串中的外部链接?

时间:2011-04-10 00:19:51

标签: php regex string hyperlink

如何检查字符串变量中的链接是否为外部链接?此字符串是网站内容(如评论,文章等)。

如果是,请如何在external属性中添加rel值?如果他们没有此属性,请附加rel="external"

3 个答案:

答案 0 :(得分:6)

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">';
    }
}

您可能需要更细粒度的检查。但这是一般方法。

答案 1 :(得分:2)

使用XML解析器,例如SimpleXML。正则表达式不是为了进行XML / HTML解析,这里是对你所做的事情的完美解释:RegEx match open tags except XHTML self-contained tags

将输入解析为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();

?>

答案 2 :(得分:1)

使用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的用户。