PHP обрезать спецсимвол уничтожает другой спецсимвол - PullRequest
1 голос
/ 08 июля 2019

Я использую эту функцию для очистки строк для упругого поиска:

function cleanString($string){
    $string = mb_convert_encoding($string, "UTF-8");
    $string = str_ireplace(array('<', '>'), array(' <', '> '), $string);
    $string = strip_tags($string);
    $string = filter_var($string, FILTER_SANITIZE_STRING);
    $string = str_ireplace(array("\t", "\n", "\r", "&nbsp;"," &shy;",":"), ' ', $string);
    $string = str_ireplace(array("&shy;","&laquo;","&raquo;","&pound;"), '', $string);
    return trim($string, ",;.:-_*+~#'\"´`!§$%&/()=?«»")
}

Это делает все что угодно, но проблема, с которой я сталкиваюсь, связана с функцией trim на оченьконец.Предполагается, что он удаляет пробелы и специальные символы и работал до недавнего времени, когда я добавил еще два специальных символа для удаления из строки: « и ».Это вызвало проблемы с другим специальным символом:

Когда я передаю слово België в функцию, ë повреждается, а упругая ошибка выдает ошибку.

  • Почему обрезаетсяиспортить совершенно другого персонажа?
  • Как я могу это исправить, чтобы я разобрал « и » и сохранил ë?

1 Ответ

4 голосов
/ 08 июля 2019

trim не поддерживает кодирование и просто просматривает отдельные байты. Если вы скажете ему обрезать '«»', и это кодируется в UTF-8, он будет искать байты C2 AB C2 BB (где C2 является избыточным, поэтому AB BB C2 - это фактические условия поиска). «ë» в UTF-8 равно C3 AB, поэтому половина его удаляется, и персонаж тем самым ломается.

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

.
preg_replace('/^[«»]+|[«»]+$/u', '', $str)
...