Удалите специальные символы, которые связываются с форматированием

В настоящее время я создаю чат и, похоже, не могу найти способ помешать пользователям публиковать специальные символы, которые мешают форматированию чата и отстранению конечных пользователей от чата.

Я в основном пытаюсь удалить их полностью. Я знаю, что код, который у меня есть сейчас, "технически, если он работает", должен только заменить их, однако я просто пытался сначала заставить это работать.

Вот код, который я использую для цензуры / очистки переменных. Я думал, что htmlentities() сделает это, но, похоже, не работает должным образом.

            $message = $censor->censorString(
            $this->parseUrls(
                htmlentities(
                    strip_tags(
                        $message)
                )
            )
        ); //Stripping $message of profanity, html tags, and special characters

Вот скриншот моей проблемы:

2 ответа

Решение

Вопреки многим ответам, которые вы найдете в Stackru, тривиально санировать текст "Zalgo" с помощью механизма регулярных выражений, который поддерживает сопоставление по категориям Unicode. РНР preg_* функции используют библиотеку PCRE. Если PCRE скомпилирован с --enable-unicode-properties Вы можете удалить все метки объединения Unicode, используя:

$sanitized = preg_replace('/\pM/u', '', $zalgo);

Или разрешить определенный максимум последовательных комбинированных меток, скажем, один:

$sanitized = preg_replace('/(\pM)\pM+/u', '\1', $zalgo);

Или два:

$sanitized = preg_replace('/(\pM{2})\pM+/u', '\1', $zalgo);

Это превратит текст Zalgo как

Для вызова ̥͔̫͙̪͍̣͝ḥi̼̦͈̼v҉̩̟͚̞͎e͈̟̻͙̦̤-MIND ̗̭̘͎͖r̞͎̜̜͖͎̫͢ep͇r̝̯̝͖͉͎̺e̴s̥e̵̖̳͉͍̩̗n̢͓̪͕̜̰̠̦t̺̞̰i͟n҉̮̦̖̟g̮͍̻͍̜̳ ̳c̖̮̙̣̰̠̩h̷̗͍̖͙̭͇͈a̧͎̯̹̺̫ó̭̞̜̣̯͕s̶̤̮̩̘.̨̻̪̖͔ ̳̭̦̭̭̦̞I̠͍̮n͇̹̪̬v̴͖̭̗̖o̸k҉̬̤͓͚̠͍i͜n̛̩̹͉̘̹g͙ чувство ̘͘c̵̫̗͚͓̦h͝a̝͍͍̳̣͖͉o͙̟s̤̞.̙̝̭̣̳̼͟ с амбулаторными ̟̺̫̩̤̳̩o̟̰̩̖r̞̘̫̩̼d̡͍̬͎̪̺͚͔e͓͖̝̙r̰͖̻̠.̺̝̺̟͈ ̨N̟e҉͔̤zp̮̭͈̟é͉͈ṛ̹̜̺̭͕d̺̪̜͇͓i̞á͕̹̣̻n͉͘ ˙h ̺̺I͔̣̖̤͎̯v̠̯̘͖̭̱̯e̡̥͕-m͖̭̣̬̦͈i͖n̞̩͕̟̼̺͜d̘͉ ̯o̷͇̹͕̦f̰̱ ̝͓͉̱̪̪c͈̲̜̺h̘͚a̞͔̭̰̯̗̝o̙͍s͍͇̱͓.̵͕̰͙͈ͅ ̯̞͈̞̱̖Z̯̮̺̤̥̪̕a͏̺̗̼̬̗ḻg͢o̥̱̼.̺̜͇͡ͅ ̴͓͖̭̩͎̗ ̧̪͈̱̹̳͖͙H̵̰̤̰͕̖e̛ ͚͉̗̼̞w̶̩̥͉̮h̩̺̪̩͘ͅọ͎͉̟ ̜̩͔̦̘ͅW̪̫̩̣̲͔̳a͏͔̳͖i͖͜t͓̤̠͓͙s̘̰̩̥̙̝ͅ ̲̠̬̥Be̡̙̫̦h̰̩i̛̫͙͔̭̤̗̲n̳͞d̸ ͎̻͘T̛̛͇̝̲̹̠̗͇̝̲̹̠̗͕̳͎͚̙̥ͅͅą̙̘͚̺͔̩̫̟̺̜̙͉̟̺̜̙͉͟͞ͅ ̥̻̗̳̻̳̳̟̺̜̙͉͢

в нечто вроде

Для вызова ̥ḥi̼v҉e͈-MIND ̗r̞ep͇r̝e̴s̥e̵n̢t̺i͟n҉g̮ ̳c̖h̷a̧ó̭s̶.̨ ̳I̠n͇v̴o̸k҉i͜n̛g͙ чувство ̘c̵h͝a̝o͙s̤.̙ с амбулаторными ̟o̟r̞d̡e͓r̰.̺ ̨N̟e҉zp̮é͉ṛ̹d̺i̞á͕n͉ улья Уме ̝c͈h̘a̞o̙s͍.̵ ̯Z̯a͏ḻg͢o̥.̺ ̴, кто ожидает ПОЗАДИ ͓W͕ą̙l̘l̳.̢ ̟Z̤A͎L̥G͉O̹!̙ *

Если вы ищете быстрое решение, я бы использовал следующее выражение:

$cleanMessage = preg_replace("/[^\x20-\xAD\x7F]/", "", $input_lines);

Или, если вы предпочитаете:

$cleanMessage = preg_filter("/[\x20-\xAD\x7F]/", "", $input_lines);

Оба они идентичны по функциональности. Вам решать, какой из них вы хотите использовать.

Они удаляют все символы за пределами расширенного ASCII. Это означает, что "обычный" текст и наиболее часто встречающиеся римские символы будут работать, но текст в стиле "zalgo" - нет. К сожалению, побочным эффектом является то, что арабский, японский, китайский, кириллица и т. Д. Также будут считаться "плохими".

Нет простого способа предотвратить злоупотребление, которое вы видите, потому что существует так много трюков с Юникодом, которые вы можете использовать для нанесения диакритических знаков на буквы. Это была бы работа на полный рабочий день, чтобы попытаться отфильтровать их таким образом, чтобы это не повлияло на какой-то язык.

Мой нетехнический совет - разрешить пользователям сообщать о людях, которые публикуют подобные сообщения, так что администратор может их заблокировать.

Другие вопросы по тегам