Ok, ich habe eine Weile gebraucht, um das herauszufinden. Ich hatte den Eindruck, dass die Kombination von Charakteren zur Herstellung von Zalgo auf diese beschränkt ist . Also erwartete ich, dass Regex die Freaks fangen würde.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
und es hat nicht funktioniert ...
Der Haken ist, dass die Liste im Wiki nicht die gesamte Bandbreite der kombinierten Zeichen abdeckt.
Was mir einen Hinweis gab, ist "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", was nicht in einem Kombinationsbereich liegt, sondern in den "privaten Gebrauch" fällt.
In C # fallen sie unter UnicodeCategory.NonSpacingMark
und das folgende Skript löscht sie aus:
[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>");
}
Wenn Sie sich die generierte Tabelle ansehen, sollten Sie sehen können, welche stapeln. Ein Bereich, der im Wiki fehlt, ist ein 06D6-06DC
anderer 0730-0749
.
AKTUALISIEREN:
Hier ist ein aktualisierter Regex , der alle Zalgo herausfischen sollte, einschließlich derjenigen, die im "normalen" Bereich umgangen wurden.
([\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,})
Am schwierigsten ist es, sie zu identifizieren, sobald Sie dies getan haben - es gibt eine Vielzahl von Lösungen, einschließlich einiger guter oben.
Hoffe das spart dir etwas Zeit.