前面2个文章,其实已经讲完了,怎么匹配内链的问题。但是还有一部份更技术化的内容并没有涉及。本文来详细讨论讨论。
前文讨论的问题,有几个前提,并没有说明清楚。
一、 文章需清理。
什么 是文章需清理。大家想一下,假如文章里面我添加了一个图片,图片链接里面有中文,直接使用内链,可能会把图片链接里面的中文拿去分词处理,实际上我们是不需要的。我们需要的是对纯文本内容进行分词处理。
所以,在分词前,需要有一步,清理所有HTML标签。非常重要。
二、替换不简单
假如一篇800字的文章讲SEO工具相关的一篇文章,我们已经用前面的方法匹配出来,SEO优化、SEO优化工具、SEO优化工具好不好,这3个词需要做内链。
是不是直接拿这3个词,把文章里面的SEO优化,替换成<a href=”内链链接” target=”_blank”>SEO优化</a>就完事了。如果只是这样,我只能说Too young,to naïve。现在所有后台涉及文本编辑的地方,可都不是纯文本。那是富文本编辑器。比如下面这个:
这并不是真实的源代码。页面的源代码是带标签的:
我们在匹配的那步是清理完所有标签去匹配关键词的。这是没有问题的。但是匹配出来的词,我们要往HTML内容里面加链接就会遇到相当多的问题了。
以Img和Alt标签为例。假如代码是下面这样的
<img src=”logo.jpg”alt=”SEO优化“ /> 我们需要的是文章里面的关键词加上链接。如果直接加上链接,这段代码会变成<img src=”logo.jpg”alt=”<a href=”link” target=”_blank”> SEO优化</a>“ />标签里面再嵌入了一层标签,这种做法显示是错的。到时候页面会出现大量的乱码。
解决方案当然是有的,经过大量的测试。我们只需要在添加内链之前,做一个处理就行了。使用的当然是最无敌的正则表达式。我把这个方法叫做替换还原法。步骤如下:
Step1:设定一个不可见字符,比如ん、⊙这种。把文章中的这种字符清理掉(正常文章应该不会有这种内容)。
Step2:匹配所有Img标签。替换并记录到字典。这句话很费解的,大概意思就是把所有<img src=”logo.jpg”alt=”SEO优化“ />,按顺序替换为ん1ん,第二条替换为ん2ん,以此类推,然后把关系写到Map里面一一对应,在Java里面是Map,在 C#里面是dictionary,在Python里面是dict,在PHP里面是数组。
结构会是这样的:
ん1ん => <img src=”logo.jpg”alt=”SEO优化“ />
ん2ん => <img src=”logo.jpg2”alt=”SEO优化2“ />
ん3ん => <img src=”logo.jpg3”alt=”SEO优化3“ />
为什么这样做呢,我需要把文章里面不能动的内容抽出来,但是抽出来之后,得还原回去,所以需要把抽出来的内容,做一个位置标记。像ん1ん这样的就是一个位置标记。
Step3:同样替换A标签,匹配时,使用正则可以快速匹配。并一个个替换掉。
Step4:现在的文章里面,应该已经没有img和A标签了,已经被替换成了ん1ん这样的内容。加上一些正常的文字了。现在可以遍历分词法得到的关键词和链接,开始插入链接了。
简单的办法是:根据位置记录下关键词,替换下来之后,同样使用ん1ん替换占位,把结果放到Map里面。
Step5:终于要成功了,现在需要做的就是遍历Map里面的数据还原回来。把所有ん1ん还原为Map里面的Value的内容。这篇文章就处理完成了。
此外的逻辑相当复杂,就不贴代码了。代码超过400行。
方法还算比较巧妙,但是目前为止,我也没见过更好的算法可以实现。
三、 收尾。
还有一些收尾工作,比如SEO优化只能加3次,加到之后,别的文章不再使用。
比如优先按最长的关键词加链接。在上面的Step4里面对关键词进行一轮排序,按长度从前往后排就行了。
比如记录每个页面的内网结果。需要保存之后,把页面ID和关键词内链表的ID关联起来保存下来即可。
结尾语:看似简单的关键词内链,其实是异常复杂的一套逻辑和架构。越是海量的内容,如果对SEO依赖非常高,对内链系统的建设来说,也是一套很挑战的技术。希望大家有所收获。