如何检查字符串变量中的链接是否为外部链接?此字符串是网站内容(如评论,文章等)。
如果是,请如何在external
属性中添加rel
值?如果他们没有此属性,请附加rel="external"
?
答案 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的用户。