ตกลงคนนี้เอาฉันในขณะที่จะคิดออกผมก็รู้สึกว่าการรวมตัวละครในการผลิต zalgo จะจำกัด เหล่านี้ ดังนั้นฉันจึงคาดว่าจะติดตาม regexเพื่อจับคนประหลาด
([\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
อัพเดท:
นี่คือ regex ที่อัปเดตซึ่งควรกำจัด 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,})
สิ่งที่ยากที่สุดคือการระบุพวกเขาเมื่อคุณทำเสร็จแล้ว - มีวิธีแก้ปัญหามากมายรวมถึงสิ่งดีๆข้างต้น
หวังว่านี่จะช่วยคุณประหยัดเวลาได้บ้าง