Ok, điều này khiến tôi mất một lúc để tìm ra, tôi có ấn tượng rằng việc kết hợp các ký tự để tạo ra zalgo bị giới hạn ở những thứ này . Vì vậy, tôi mong đợi theo dõi regex để bắt những con quái vật.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
và nó không hoạt động ...
Điều đáng chú ý là danh sách trong wiki không bao gồm đầy đủ các ký tự kết hợp.
Điều đã gợi ý cho tôi là "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
= "e49" mà không nằm trong phạm vi kết hợp, nó rơi vào "Sử dụng cá nhân".
Trong C #, chúng nằm dưới UnicodeCategory.NonSpacingMark
và tập lệnh sau sẽ loại bỏ chúng:
[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>");
}
Bằng cách nhìn vào bảng được tạo, bạn sẽ có thể biết cái nào xếp chồng lên nhau. Một phạm vi bị thiếu trên wiki là 06D6-06DC
một phạm vi khác 0730-0749
.
CẬP NHẬT:
Đây là regex được cập nhật sẽ đánh bắt tất cả các zalgo bao gồm cả những con bị bỏ qua trong phạm vi 'bình thường'.
([\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,})
Điều khó nhất là xác định chúng, một khi bạn đã làm được điều đó - có vô số giải pháp bao gồm một số giải pháp tốt ở trên.
Hy vọng điều này giúp bạn tiết kiệm thời gian.