如何使用 php 阻止 zalgo 文本

aft*_*4ik 3 php regex unicode zalgo

我对Zalgo有一些问题

\n\n

像下面这样的文字弄乱了我的图像板。有没有办法防止这些字符并“修复”或清理文本?

\n\n

示例文本来源

\n\n

全部都是 LOS\xcc\x81\xcc\x8f\xcd\x84\xcd\x96\xcc\xa9\xcd\x87\xcc\x97\xcc\xaaT 全部 I\xe2\x80\x8bS 丢失了 pon\xcc\xb7y他来了他c\xcc\xb6\xcc\xaeomes 他来了ich\xe2\x80\x8bor 渗透到我的脸我的脸\xe1\xb5\x92h 上帝没有NOO\xcc\xbcO\xe2\x80\x8bO N\ xce\x98 停止 an\xe2\x80\x8b*\xcd\x91\xcc\xbe\xcc\xbe\xcc\xb6\xe2\x80\x8b\xcc\x85\xcd\xab\xcd\x8f\xcc\ x99\xcc\xa4g\xcd\x9b\xcd\x86\xcc\xbe\xcd\xab\xcc\x91\xcd\x86\xcd\x87\xcc\xabl\xcc\x8d\xcd\xab\xcd\xa5\ xcd\xa8\xcd\x96\xcd\x89\xcc\x97\xcc\xa9\xcc\xb3\xcc\x9fe\xcc\x85\xcc\xa0s\xcd\x8ea\xcc\xa7\xcd\x88\xcd\ x96r\xcc\xbd\xcc\xbe\xcd\x84\xcd\x92\xcd\x91e n\xe2\x80\x8bot 重新\xcc\x80\xcc\x91\xcd\xa7\xcc\x8ca\xcd\xa8l\ xcc\x83\xcd\xa4\xcd\x82\xcc\xbe\xcc\x86\xcc\x98\xcc\x9d\xcc\x99 ZA\xcd\xa0\xcc\xa1\xcd\x8a\xcd\x9dLG\xce \x8c IS\xcd\xae\xcc\x82\xd2\x89\xcc\xaf\xcd\x88\xcd\x95\xcc\xb9\xcc\x98\xcc\xb1 TO\xcd\x85\xcd\x87\xcc \xb9\xcc\xba\xc6\x9d\xcc\xb4\xc8\xb3\xcc\xb3 TH\xcc\x98E\xcd\x84\xcc\x89\xcd\x96\xcd\xa0P\xcc\xaf\xcd\ x8d\xcc\xadO\xcc\x9a\xe2\x80\x8bN\xcc\x90Y\xcc\xa1 H\xcd\xa8\xcd\x8a\xcc\xbd\xcc\x85\xcc\xbe\xcc\x8e\xcc \xa1\xcc\xb8\xcc\xaa\xcc\xafE\xcc\xbe\xcd\x9b\xcd\xaa\xcd\x84\xcc\x80\xcc\x81\xcc\xa7\xcd\x98\xcc\xac \xcc\xa9 \xcd\xa7\xcc\xbe\xcd\xac\xcc\xa7\xcc\xb6\xcc\xa8\xcc\xb1\xcc\xb9\xcc\xad\xcc\xafC\xcd\xad\xcc \x8f\xcd\xa5\xcd\xae\xcd\x9f\xcc\xb7\xcc\x99\xcc\xb2\xcc\x9d\xcd\x96O\xcd\xae\xcd\x8f\xcc\xae\xcc\xaa \xcc\x9d\xcd\x8dM\xcd\x8a\xcc\x92\xcc\x9a\xcd\xaa\xcd\xa9\xcd\xac\xcc\x9a\xcd\x9c\xcc\xb2\xcc\x96E\xcc \x91\xcd\xa9\xcd\x8c\xcd\x9d\xcc\xb4\xcc\x9f\xcc\x9f\xcd\x99\xcc\x9eS\xcd\xaf\xcc\xbf\xcc\x94\xcc\xa8 \xcd\x80\xcc\xa5\xcd\x85\xcc\xab\xcd\x8e\xcc\xad

\n\n

我尝试使用这个解决方案:

\n\n
$cleanMessage = preg_replace("/[^\\x20-\\xAD\\x7F]/", "", $input_lines);\n
Run Code Online (Sandbox Code Playgroud)\n\n

摘自此处:删除与格式混淆的特殊字符\n但它仅适用于拉丁字符\n任何人都可以帮助我吗?

\n

aft*_*4ik 5

此正则表达式替换变量中的每个上标符号$text

\n\n
$text = preg_replace("~[\\p{M}]~uis","", $text);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果$text包含带上标的 char,例如,\xe0\xb8\x81\xe0\xb8\xb4此正则表达式将删除该上标符号,结果 $text 将仅包含\xe0\xb8\x81.

\n\n

我改进了这个正则表达式并将其更改为仅过滤第二级音标

\n\n
$text = preg_replace("~(?:[\\p{M}]{1})([\\p{M}])+?~uis","", $text);\n
Run Code Online (Sandbox Code Playgroud)\n\n

此正则表达式将仅过滤第二级上标符号。\n如果您想过滤德语或带有保留标记的其他语言,请使用它。\n此正则表达式将转换此单词 -

\n\n

\xcd\x90\xcc\x88\xcd\xa9\xcc\x8eZ\xcd\xae\xcd\x8c\xcd\xa6\xcd\x86\xcd\xa6\xcd\xa4A\xcc\x83\xcc\x89\xcd\x9b\xcc\x84\xcc\x9a\xcd\xad\xcc\x88L\xcd\xabG\xcc\x89\xcc\x8b\xcd\x82\xcc\x89O\xcd\xa8\xcd\x8c\xcc\x8b\xcd\x97!

\n\n

进入这个:ZA\xcc\x88L\xcd\xabGO!

\n\n

我希望第二个正则表达式能帮助你。

\n

  • 使用“\p{M}”,您不仅删除了 Zalgo,还删除了 [Unicode 通用类别“标记”](http://unicode.org/reports/tr44/#General_Category_Values) 下的所有字符)。使用此方法,您还可以删除重要的代码,例如拉丁语言中常用的变音符号。此外,模式中不需要字符类,也不需要“i”或“s”修饰符。 (4认同)