2017-03-11 32 views
4

我正在使用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 

回答

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的,所以你需要將其刪除,如果角色不被識別,然後用\u0替換\x。例如。 \x{15e}變爲\u015e

然後,您可以執行與使用/[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/g時相同的匹配項。

注意:得到一個字符的Unicode格式,你可以做"Ğ".charCodeAt(0).toString(16);\x\u0前綴它。

希望這可以幫助,至少承認你可以編碼正則表達式中的字符,仍然匹配相同。 :)

0

編碼您的JavaScript文件爲UTF-8和更新你的元標記:

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

希望這會幫助你。

+0

感謝您的回覆,但我將其用於Firebase函數。我只有中等詞彙功能。它正在過濾應用程序 – Brkr

1

可以請你嘗試:

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

可以肯定的,你必須使用replaceRegex選項。


模式匹配所有的情況。

這裏是/(\w+)/gi描述性地做(感謝regex101):

  1. 1捕獲組(\ w +)。
    1. \ W +任何字字符(等於[A-ZA-Z0-9_])匹配
    2. +量詞 - 酮和無限時間之間匹配,多次地,用之於如需要(貪婪)
  2. 全球圖案標誌
    1. 我改性劑:不敏感。不區分大小寫的匹配(忽略[a-zA-Z]的情況)
    2. g修飾符:global。所有的比賽(第一場比賽後不返回)
+0

我用你的正則表達式,但仍然只阻止英文字符的單詞。如果單詞包含像土耳其語的字符,則不會過濾 – Brkr

1

您需要通過添加u標誌,它使這個正則表達式Unicode-aware。更確切地說,將/[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/g更改爲/[A-Za-z0-9öÖÇ窺ĞğİıÜü_]/gu(最後添加了u)。這隻會在modern browsers(基本上,除了Internet Explorer之外)都有效。也有other options,你可能想要考慮是否要支持舊瀏覽器。