Так же просто, как:
$unwanted = 'abggwdḍefkkwhḤƐxqijlmnurṚɣsṢctṬwyzẒ';
$badText = 'Foo baṚ Baz';
$goodText = '345235';
if (preg_match_all("/[$unwanted]/u", $badText, $matches)) {
echo "Bad text is bad, invalid characters: " . join(', ', $matches[0]) . PHP_EOL;
}
if (preg_match_all("/[$unwanted]/u", $goodText, $matches)) {
echo "Good text is bad, invalid characters: " . join(', ', $matches[0]) . PHP_EOL;
}
Обратите внимание, что ваш исходный код должен быть сохранен в UTF-8, а вход должен быть также в формате UTF-8.
I'mдействительно ставит под сомнение использование черного списка UTF-8, поскольку существуют сотни тысяч кодов.Внесение в черный список их частей кажется бесполезным тяжелым сражением.Если вы запретили «Ṛ», почему бы вам принять «Ŗ» или любой другой вариант символов «R».Поймать их всех довольно бесполезно.Подумайте о реализации белого списка .(То есть, если я вообще понимаю, что вы пытаетесь сделать. Это не совсем понятно.)
Обратите внимание, что символы могут быть разложенными ,что означало бы, что они не будут соответствовать вашему выражению.Например, ü
может быть символом ü
(U + 00FC) или ü
(U + 0075 U + 0308, то есть u
, за которым следует объединение ¨
).Вам следует нормализовать символов в NFC (каноническая декомпозиция с последующей канонической композицией), что означает, что любая форма ü
будет нормализована до U + 00FC.В PHP вы делаете это с помощью:
$badText = Normalizer::normalize($badText, Normalizer::FORM_C);
Normalizer
class , к сожалению, не везде устанавливается по умолчанию.