2015-03-16 3 views
0

У меня есть приложение, где мои пользователи могут писать комментарии. Но я хочу фильтровать оскорбления со специальными символами.Regex.IsMatch return false

string comment = "Ðick"; // With special "Ð". 

comment = Regex.Replace(comment, @"[^a-z0-9 ]", "[a-z]"); // Replace special char by "[a-z]" 
Regex regex = new Regex(@""+comment +""); // @"[a-z]ick" 

return (regex.IsMatch("dick")) ? true : false; 

Когда комментарий только «ДИК» функция возвращает истину, но если комментарий является «ДИК с другим словом» функция возвращает ложь. Зачем?

+0

Каково значение 'comment' после' Replace() '? – CodeCaster

+0

см. Здесь: https://msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx – Nostradamus

+0

Может быть проще просто запретить все специальные символы. –

ответ

2

То, что вы пытаетесь сделать, часто делается с канонической декомпозицией плюс снятие «Сочетания диакритических знаков». Вы не можете сделать это с чистым регулярным выражением ... и даже имея немного C#, вы должны сделать это вручную для некоторых символов (например, Ð - D или Ø - O). Для некоторых других символов, которые вы можете сделать это в более «автоматизированной» способом (например, è к e) с помощью string.Normalize, как:

string comment = "Ðè"; 

// Here we split (è) to U+0065 (e) U+0300 (̀) 
string commentNormalized = comment.Normalize(NormalizationForm.FormD); 

// Here we remove all the UnicodeCategory.NonSpacingMark 
// that are the diacritics like U+0300 (̀) 
// and rebuild the string. This line can be speedup a little, but 
// it would be longer to write :-) 
string comment2 = new string(commentNormalized.Where(x => char.GetUnicodeCategory(x) != UnicodeCategory.NonSpacingMark).ToArray()); 

Теперь comment2 является "Ðe".

Это потому, что è имеет «каноническое разложение» U+0065 (e) U+0300 (̀), так что вы можете обнаружить, что è «подобен» в e, в то время как для Ð это «Каноническое разложение» по-прежнему U+00D0 (Ð) так же характер.

То, что вы пытаетесь сделать, бесполезно: когда вы запрещаете персонажа, пользователи найдут еще один «похожий» характер ... вы когда-нибудь слышали о Leet? Есть D1ck (1 вместо i) лучше, чем ваше слово? :-)

Как правило, лучше иметь словарь «запрещенных слов», который имеет как Dork, так и Ðork, и когда вы найдете новую перестановку «оскорбительного» слова, вы просто добавляете его. Человеческая фантазия бесконечна ... так что должен быть ваш словарь :-), но одно слово за раз.

+0

Спасибо, я приму себя, чтобы запретить специальные символы. –

+0

@ LaurieCos Это все еще идея * stupd * :-) У вас все еще есть * d1ck * пользователи, даже без специальных символов. и язык имеет больше информации, чем необходимо ... вы можете удалить одну или две буквы из слова, и 90% людей по-прежнему смогут понять это слово. – xanatos