最近做了一个关于给文章内容添加内链的功能,就是将文章中我们认为是关键词的词替换为带有链接的词,如果仅仅是将文章内容中的关键词替换为带有链接的关键词那也就没什么好说的了,但产品部门希望的是文章中出现的关键词替换个数不能超过5个,同时要求长关键词优先,比如"www.phpernote.com"和"phpernote.com"两个关键词,那么"www.phpernote.com"拥有优先被匹配的权利,同时对于一篇文章中出现了多个同样的关键词,只需要替换一次就行。这也许更符合SEO,同时也更能提高网站的用户体验度,但对于程序来说,可就一下子将程序搞复杂了不少!下面就分享一下本人做这个网站文章内链系统的做法。
首先新建了一个数据库用来保存我们输入的关键词以及关键词对应的链接。这里只是用来保存,为了能让前台读取的数据更快一些,最后还是将该表生成了一个数组缓存,数组 key 为关键词,数组 key 对应为关键词的链接。在生成数组的缓存过程中同时也对长关键词优先也做了考虑,就是对这个数组按照值的长短进行了一个排序,值字符串比较长的排在前面,这里面的排序主要是借鉴了冒泡排序算法。可参考本站文章:php冒泡排序算法
冒泡排序算法中有下面这么一个判断:
if($array[$j] > $array[$j+1])
只需简单的将其对应修改为:
if(strlen($array[$j]) > strlen($array[$j+1]))
ok了,上面就将我们的关键词和关键词链接处理成了一个按关键词从长到短的小巧缓存数组了。
对于如何将 php 数组缓存成文本类型的数组,请参考本站文章:php将数组保存为文本格式的方法总结
ok,材料准备齐全了,下面该实现如何进行关键词的替换了。其实很简单,此次实现的方法是对关键词进行一个循环,依次从数组的第一个值在内容中匹配,匹配到了就相应的将计数器加一,到计速器大于5的时候就退出不再进行匹配了。当然这个过程中还涉及到了对相同的关键词只匹配一次的算法,对于这个,可参考本站文章:PHP 只替换一次,控制替换次数
下面贴出一下这部分的关键性代码:
$i=0; foreach($keywords_array as $k=>$v){ if($i>4){ break; } if(false!==strpos($content,$k)){ $replace='<a href="'.$v.'" target="_blank">'.$k.'</a>'; str_replace_once($k,$replace,$content); $i++; } }
至此,一个文章内链系统已经就基本完成了。但在实际测试过程中发现还有个bug就是当短关键词被长关键词包含了时候,会导致出现重复替换的现象,比如"www.phpernote.com"这个关键词被替换后,假设第二个关键词是"phpernote.com",这个时候就会将"phpernote.com"又进行了一次替换。本人想了良久都没有办法解决,研究了一下织梦,貌似也存在这个问题。经过不断的尝试,最终的解决办法是在替换关键词的时候不仅仅是对关键词加个链接,加链接的同时也将对应的关键词经过一种类似加密的算法将关键词替换成为一个唯一的字符串,在内容匹配完后再通过相应的解密算法将关键词又替换回来,呵呵,这个东西最后越高越复杂。其实这个bug也不算什么大bug,要求不高的话不需要这一步的处理。