一般在文章展示时,都会将其中的关键词加上链接,增加网站的粘合性。想想觉得挺简单的,直接替换字符串不就行了。
可细细想来,还是有不少问题。比如文章内的html标签,标签里的内容可以不用替换;再比如一个关键词包含另外一个关键词,如果先替换短的关键词,那就会有问题。
以下是笔者总结的一些内容,供大家学习参考。
1、实现的思路:
对关键词数组进行排序,长的关键词排到前面,这样就可以先替换长的关键词。
提取出所有html标签,暂存到数组里。
根据html标签对内容进行分割,将分割的内容保存到一个数组里。
循环分割的内容数组,替换关键词链接。
将提取的html标签和分割的内容数组拼接起来,得到最终结果。
2、关键步骤的代码说明:
关键词数组排序
关键词数组$keywordArray是二维数组,结构如下:
二维数组排序可以使用内置函数usort,代码如下:
提取出所有html标签
这边的正则就是将<>包着的内容都提取出来,笔者认为凡是需要将<>号当成内容显示的,都应当用转义字符<>来替换,对于一切<>包着的内容都可以认为是标签。事实上浏览器也是这么干的,很多在线的文本编辑器也会自动转义这些字符。
分割内容,保存到数组
$noTagContentArray = preg_split('/</?[a-zA-Z]+[^>]*>/', $content);
这边用的正则表达式和上面提取html标签用的正则一致。
循环分割的内容数组,替换关键词链接
这边的处理方式是先将关键词替换成md5值,再将md5值替换成带链接的关键词,之所以这么处理,是为了解决关键词之间包含的情况。另外,笔者曾经考虑将分割的内容数组implode成一个字符串,就不用循环替换了,但是担心implode之后的字符串在拼接处会形成关键词,所以就没这么处理。
组合提取的html标签和处理后的内容
这步就比较简单了,依次拼接就OK了。需要注意的是html标签数组会比分割的内容数组长度小1,所以在取标签时,要用isset来判断下。
以上内容经多次测试没有问题,如有疑问,欢迎进入本站QQ群:161228069 沟通交流。