PHP Как проверить, присутствует ли строка utf-8 в другой строке? - PullRequest
1 голос
/ 09 сентября 2011

Я действительно изо всех сил пытался выяснить это .. но: (

в форме пользователь вводит слово, и мне нужно проверить, не содержит ли его ввод символов из предустановленной таблицы символов:

abggwdḍefkkwhḤƐxqijlmnurṚɣsṢctṬwyzẒ

Пока что я использую код, который я нашел в php.net:

$temp_s = mb_convert_encoding($post['word'],'UTF-16','UTF-8');
$temp_a = str_split($temp_s,4);
$temp_a_len = count($temp_a);

for($i=0; $i<$temp_a_len; $i++){
    $temp_a[$i] = mb_convert_encoding($temp_a[$i],'UTF-8','UTF-16');

    $pos = stripos( mb_strtolower($allowed),  mb_strtolower($temp_a[$i]) );
    if($pos === false){
        echo '- '. mb_strtolower($temp_a[$i]) .' -is not allowed in '.mb_strtolower($allowed);
        return false;
    } 
}

что я делаю не так? потому что, если я отправлю символ , он выдаст:

- ḍ -is not allowed in abggwdḌefkkwhḤƐxqijlmnurṚɣsṢctṬwyzẒ

UPDATE Другое дело, как разрешить прописные или строчные версии списка разрешенных символов $?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Так же просто, как:

$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 , к сожалению, не везде устанавливается по умолчанию.

1 голос
/ 09 сентября 2011

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

$input = 'ḍwhat';

$allowed = mb_strtolower('ḍabggwdefkkwhḤƐxqijlmnurṚɣsṢctṬwyzẒ');

foreach (preg_split('//u', $input) as $c) {
  if (mb_strlen($c) !== 0 && mb_strpos($allowed, mb_strtolower($c)) === FALSE) {
    echo '-' . $c . '- is not allowded in ' . $allowed;
    return false;
  }
}

Единственное, что я хотел бы сказать, это попробовать ваш оригинальный код вместо str_split($temp_s,2);, так как 4 не всегда будет работать, и больше UTF-16 будет 2 байта. Хотя оба потенциально сломаются.

1 голос
/ 09 сентября 2011

не было проблем в моем затмении

$allowed = 'ḍabggwdefkkwhḤƐxqijlmnurṚɣsṢctṬwyzẒ';
$temp_s = mb_convert_encoding('ḍ','UTF-16','UTF-8');
$temp_a = str_split($temp_s,4);
$temp_a_len = count($temp_a);

for($i=0; $i<$temp_a_len; $i++){
$temp_a[$i] = mb_convert_encoding($temp_a[$i],'UTF-8','UTF-16');

$pos = stripos( mb_strtolower($allowed),  mb_strtolower($temp_a[$i]) );
if($pos === false){
    echo '- '. mb_strtolower($temp_a[$i]) .' -is not allowed in '.mb_strtolower($allowed);

} 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...