Хорошо, это заняло у меня некоторое время, чтобы понять, у меня сложилось впечатление, что объединение символов для создания zalgo ограничено этими а>. Поэтому я ожидал, что следует за регулярным выражением, чтобы поймать уродов.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
и не получилось...
Загвоздка в том, что список в вики не охватывает весь диапазон комбинаций символов.
Что дало мне подсказку, так это "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", который не входит в диапазон объединения, он попадает в "частное использование".
В C# они попадают под UnicodeCategory.NonSpacingMark
, и следующий скрипт удаляет их:
[Test]
public void IsZalgo()
{
var zalgo = new[] { UnicodeCategory.NonSpacingMark };
File.Delete("IsModifyLike.html");
File.AppendAllText("IsModifyLike.html", "<table>");
for (var i = 0; i < 65535; i++)
{
var c = (char)i;
if (zalgo.Contains(Char.GetUnicodeCategory(c)))
{
File.AppendAllText("IsModifyLike.html", string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>A&#{3};&#{3};&#{3}</td></tr>\n", i.ToString("X"), c, Char.GetUnicodeCategory(c), i));
}
}
File.AppendAllText("IsModifyLike.html", "</table>");
}
Глядя на сгенерированную таблицу, вы сможете увидеть, какие из них складываются. Один диапазон, которого нет в вики, это 06D6-06DC
другой 0730-0749
.
ОБНОВЛЕНИЕ:
Вот обновленное регулярное выражение, которое должно вылавливать все zalgo, включая те, которые были пропущены в "нормальном" диапазоне.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,})
Самое сложное — это идентифицировать их, как только вы это сделаете — существует множество решений, в том числе несколько хороших из приведенных выше.
Надеюсь, это сэкономит вам время.
person
Matas Vaitkevicius
schedule
17.03.2016
How can we sanitize this?
-- Почему? - person Yakov Galka   schedule 03.05.2012overflow: hidden
. - person T.J. Crowder   schedule 04.05.2012