去除字符串中除指定域名和相对路径外的其他链接

江边望海 发布于 2012/06/14 14:19
阅读 334
收藏 1
PHP

产品需求:

用户在发布文章的时候,往往会添加很多外链,特别是那些流量和权重都比较大的网站,用户通过发布文章的方式制造反向链接。为了防止用户在文章中大量使用站外的链接,有必要将除本站意外的其他链接去除掉,并且需要保留用户添加的相对链接,因为用户可能再用相对链接链接本站的页面。

实现思路:

1.通过正则获取文章中的所有链接;
2.去除掉相对链接和本站链接;
3.将这些链接清除掉但保留链接中的图片和内容;
4.用清除过链接的内容替换文章中的链接。

代码(基于PHP的代码实现):

<?php
function delLink($string, $domain='qq.com') {
        $string = str_replace(PHP_EOL, '', $string);
        $pattern = '/<a(.*?)>(.*?)<\/a>/i';
	preg_match_all($pattern, $string, $match);
	if (is_array($match) && !empty($match)) {
		foreach ($match[0] as $key=>$value) {
			if (strpos($value, $domain) || !strpos($value, 'http://')) {
				unset($match[0][$key]);
			}
			if (isset($match[0][$key])) {
				$string = str_replace($value, preg_replace("/<a[^>]*href=[^>]*>|<\/[^a]*a[^>]*>/i","",$value), $string);
			}
		}
	}
	return $string;
}

$string = file_get_contents('http://www.oschina.net');//远程开源中国的首页
echo delLink($string);

测试一下,是不是非qq.com的链接都去掉了呢,Yeah!

PS:由于文章中链接过多会影响效率。因此,可以控制一下文章长度来提高效率

加载中
0
wc1217
wc1217
我以为是用preg_replace 完成的呢.

循环的效率不高吧,

还有.替换PHP_EOL的效率也不高吧, php的修正符中的: s 好像是把换行似为普通字符吧, 类似js中的g(global)?..
江边望海
江边望海
确实效率不是很高,由于我对正则不是很熟悉,因此只能用php来弥补这一点儿啦,还请高人指点
返回顶部
顶部