【发布时间】:2011-06-29 14:02:07
【问题描述】:
下面的函数旨在将rel="nofollow" 属性应用到所有外部链接,而不是内部链接,除非路径与下面定义为$my_folder 的预定义根URL 匹配。
所以给定变量...
$my_folder = 'http://localhost/mytest/go/';
$blog_url = 'http://localhost/mytest';
还有内容……
<a href="http://localhost/mytest/">internal</a>
<a href="http://localhost/mytest/go/hostgator">internal cloaked link</a>
<a href="http://cnn.com">external</a>
替换后的结果应该是……
<a href="http://localhost/mytest/">internal</a>
<a href="http://localhost/mytest/go/hostgator" rel="nofollow">internal cloaked link</a>
<a href="http://cnn.com" rel="nofollow">external</a>
请注意,第一个链接没有改变,因为它是一个内部链接。
第二行的链接也是一个内部链接,但是因为它匹配我们的$my_folder字符串,所以它也得到了nofollow。
第三个链接是最简单的,因为它不匹配blog_url,它显然是一个外部链接。
但是,在下面的脚本中,我的所有链接都获得了nofollow。如何修复脚本以执行我想要的操作?
function save_rseo_nofollow($content) {
$my_folder = $rseo['nofollow_folder'];
$blog_url = get_bloginfo('url');
preg_match_all('~<a.*>~isU',$content["post_content"],$matches);
for ( $i = 0; $i <= sizeof($matches[0]); $i++){
if ( !preg_match( '~nofollow~is',$matches[0][$i])
&& (preg_match('~' . $my_folder . '~', $matches[0][$i])
|| !preg_match( '~'.$blog_url.'~',$matches[0][$i]))){
$result = trim($matches[0][$i],">");
$result .= ' rel="nofollow">';
$content["post_content"] = str_replace($matches[0][$i], $result, $content["post_content"]);
}
}
return $content;
}
【问题讨论】:
-
我认为 DOMDocument 用这个会更好。
-
@alex:别让我开始,哈哈。我敢肯定,但每次我尝试过时,我的代码都增加了 4 倍,而且它永远不会完全正确。至少我可以让 preg_match 工作,但它需要一些小的调整。但是,如果有人可以使用适用于 WordPress 内容编辑器的 post_content 对象的 DOMdocument 示例解决问题,我不反对再给 DOMdocument 一个机会。
-
尝试 phpQuery 而不是繁琐的 DOMDocument。但在这一点上,也不应该忽视部署
rel=nofollow是毫无意义的。它对您或任何其他人的垃圾邮件问题没有帮助。这只是免费劳动力,因此 Google 的工作量更少。也不知道它对垃圾邮件机器人有威慑作用。 -
@Scott B 我发布了一个可行的 DOMDocument 解决方案。 :)
-
@mario 我同意 DOMDocument 很麻烦。我可能很快就会查看这个 phpQuery,感谢您的建议:)
标签: php regex preg-match