带有特殊字符的坏词过滤器

时间:2017-03-11 09:44:37

标签: javascript regex npm

我正在使用https://www.npmjs.com/package/bad-words,我为过滤器特殊字符创建了正则表达式。

const Filter = require('bad-words');
const badWordsFilter = new Filter({replaceRegex:  /[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/g});
badWordsFilter.addWords(['badword', 'şğ'])

如果单词不包含土耳其字符,则有效。但如果我写ş或ğ等土耳其字符,则不会过滤。

我的正则表达式错了吗?

我在文档中找到了这段代码:

var filter = new Filter({ regex: /\*|\.|$/gi });
var filter = new Filter({ replaceRegex:  /[A-Za-z0-9가-힣_]/g }); 
//multilingual support for word filtering

4 个答案:

答案 0 :(得分:2)

您显然遇到编码问题,因为您的正则表达式适用于您的应用,请参阅此处:https://regex101.com/r/VpItfH/3/

因此,我认为在您的应用中使用正则表达式编码角色可能有所帮助:

请在此处查看已编码的正则表达式结果:https://regex101.com/r/VpItfH/4/

更多详情

在PCRE正则表达式引擎中尝试以下编码的正则表达式将起作用(https://regex101.com/r/VpItfH/5):

/[A-Za-z0-9\x{f6}\x{d6}\x{c7}\x{e7}\x{15e}\x{15f}\x{11e}\x{11f}\x{130}\x{131}\x{dc}\x{fc}_]/g

但是在选择javascript正则表达式引擎时,{}会破坏unicode,因此您需要将其删除,如果无法识别该字符,则将\x替换为{{1} }}。例如。 \u0变为\x{15e}

然后,您可以执行与使用\u015e时相同的匹配。

  

注意:要获取角色的unicode形式,您可以/[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/g并在其前加"Ğ".charCodeAt(0).toString(16);\x

希望这可以提供帮助,并且至少承认您可以对正则表达式中的字符进行编码并且仍然匹配相同的字符。 :)

答案 1 :(得分:1)

请你试试:

var filter = new Filter({ replaceRegex: /(\w+)/gi });

当然,您必须使用replaceRegex选项。

该模式与所有情况完全匹配。

这是/(\w+)/gi描述性的内容(感谢regex101):

  1. 第一捕获组(\ w +)。
    1. \ w + 匹配任何字词(等于[a-zA-Z0-9 _])
    2. + Quantifier - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
  2. 全局模式标记
    1. i修饰符:不敏感。不区分大小写的匹配(忽略[a-zA-Z]的情况)
    2. g修饰符:全局。所有比赛(首场比赛后不返回)

答案 2 :(得分:1)

您需要通过向其添加u标记来制作正则表达式Unicode-aware。更准确地说,将/[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/g更改为/[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/gu(最后添加u)。这只适用于modern browsers(基本上只有Internet Explorer)。还有other options,您可能需要考虑是否要支持旧浏览器。

答案 3 :(得分:0)

将您的javascript文件编码为utf-8,并将您的元标记更新为:

<meta http-equiv="content-type" content="text/html;charset=utf-8" />

希望这会对你有所帮助。