Tamam, bunu anlamam biraz zaman aldı, zalgo üretmek için karakterleri birleştirmenin bunlarla sınırlı olduğu izlenimine kapılmıştım . Bu yüzden, normal ifadeyi takiben ucubeleri yakalamasını bekliyordum .
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
ve işe yaramadı ...
İşin püf noktası, wiki'deki listenin tüm karakter kombinasyonlarını kapsamadığıdır.
Bana bir ipucu veren "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49", birleştirme aralığında değil, 'Özel kullanıma' giriyor.
C # 'da altına düşer UnicodeCategory.NonSpacingMark
ve aşağıdaki komut dosyası onları temizler:
[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>");
}
Oluşturulan tabloya bakarak hangilerinin yığıldığını görebilmelisiniz. Wiki'de eksik olan bir aralık 06D6-06DC
diğeridir 0730-0749
.
GÜNCELLEME:
İşte , 'normal' aralıkta atlananlar da dahil olmak üzere tüm zalgoları yakalaması gereken güncellenmiş normal ifade.
([\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,})
İşin en zor kısmı, bunu yaptıktan sonra onları tanımlamaktır - yukarıdakilerden bazılarını içeren çok sayıda çözüm vardır.
Umarım bu size biraz zaman kazandırır.