我想写一些“antimat”。
有文本所在的块,重点是“走过”这些块,检查文本是否存在“禁止词”并用某些东西替换它。
经过思考,我决定不对单词本身进行任何替换,而是简单地将其包裹起来span并将其设置为,比如说filter: blur(5px).
哇..
关键是,在我的脑海中,实现是这样的..
“bedwords”,循环遍历块,循环遍历“bedwoods”+在文本中搜索一个单词,找到它后,用<span class="badword">слово</span>..替换这个单词
我会问这个问题,我想在其中获得现成的代码,但我也会尝试自己编写。
虽然没有,甚至不是那样,但总的来说,这是一种比赛,最后,“喜欢”最多的答案将获得500个萝卜。
截止日期,直到 2019 年 3 月 10 日
总的来说,我希望它会很有趣并且管理员不会关闭它)
假设它看起来像这样:
let badword = [
'Lorem',
'non',
'lectus',
'ligula',
'nisi'
];
<div class="content">
<div class="item">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div class="item">
Suspendisse non pharetra mauris. Suspendisse a lacinia lacus. Nulla facilisi.
</div>
<div class="item">
Suspendisse eu lectus aliquam, porttitor est eleifend, blandit mauris.
</div>
<div class="item">
Nunc ut bibendum ligula, eu consequat odio. Praesent fermentum nisi a lobortis rhoncus. Phasellus vel metus eu dolor molestie porta.
</div>
</div>
如果块内容
.item不需要嵌套标签,则:|;如果允许任何格式,则需要更复杂的逻辑:
资源
所以这是我的选择。
这个怎么运作?
要在元素及其所有子元素中查找坏词,您只需
findBadWords()在我们需要的元素上设置函数。输入有 2 个参数:jq元素本身(例如body)和字典(字符串数组)。例如findBadWords($("body"), ["дурак", "дебил", "пипец"]);.代码递归地遍历所有
textNode这些,如果它从字典中找到一些东西,它会包装这个词span并用这个新词替换前一行。(!!!) 代码需要改进,理想情况下应该重写为 vanilla
js以提高性能。如您所见,代码并不关心坏词的位置和深度。如果有任何缺点或改进建议 - 请写在评论中。
在与 DOM 交互方面,我的回答不是很新颖,但我决定不使用外部库。
我建议使用更智能的搜索实现。
这种搜索会改善还是恶化是另一个问题,这里需要微调。
为了搜索坏词,这里使用了Levenshtein 距离分析。
单词A和B之间的Levenshtein 距离- 简而言之,这是单词A中需要更改的字符数才能得到单词B。
这使得找到相似的词成为可能。
我没有在这里给出这个算法的简单递归实现,你可以在这个链接上阅读它。
为确保字典中的工作,丢弃结尾,然后搜索包含Levenshtein 距离小于或等于2的单词的所有元素(您可以通过为每个单词设置自己的阈值距离来稍微改进搜索)和然后是 DOM 替换。
PS。vygreb 标点的正则表达式也需要在应用的地方进行改进。
如果可以重新创建以前创建的元素,那么可以非常简单地完成:
如果无法重新创建元素,那么您应该使用以下内容:https ://ru.stackoverflow.com/a/919286/178988