Php субстр Utf-8 выпуск - PullRequest
0 голосов
/ 20 марта 2019

Когда я запускаю этот код

   $string='<p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p>';

echo substr(strip_tags(trim(html_entity_decode($string,   ENT_COMPAT, 'UTF-8'))), 0, 14);;

я получаю этот результат.

Şelamiİnnş

в чем моя ошибка?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

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

$string=html_entity_decode($string,   ENT_COMPAT, 'UTF-8');
echo $string, "\n";
$string = trim($string);
echo $string, "\n";
$string = strip_tags($string);
echo $string, "\n";
$string = substr($string, 0, 14);
echo $string, "\n";

Если вы запустите это, вы увидите, что проблема не имеет ничего общего с strip_tags, она имеет отношение к substr.

Причина очень проста: строки в PHP - это просто последовательность байтов; такие функции, как substr не учитывают "символы" каким-либо значимым образом. Так что substr($string, 0, 14) просто берет первые 14 байтов строки, что в данном случае приводит к разбиению «символа», который был закодирован как более одного байта, с использованием UTF-8.

Наиболее распространенным решением для этого является использование mb_substr (часть расширения PHP "mbstring"), которое считает "символы" в соответствии с некоторой кодировкой:

$string = mb_substr($string, 0, 14, 'UTF-8');
echo $string, "\n"; 
// Şelamiİnnşşasd

Обратите внимание, что это будет сокращено до 14 кодовых точек Unicode , поэтому все еще можно делать странные вещи, такие как срезать акцент с буквы, если она была закодирована с использованием "диакритического символа".

Альтернативой в некоторых случаях было бы использование grapheme_substr (часть расширения "intl"), которое разделяется на "графемы", которые предназначены примерно как то, что люди думают как «символ» или «буква». В этом случае он дает тот же результат:

$string = grapheme_substr($string, 0, 14, 'UTF-8');
echo $string, "\n"; 
// Şelamiİnnşşasd

Но в других случаях это может быть не так:

$string = 'noël';
echo mb_substr($string, 0, 3, 'UTF-8'), "\n"; // noe
echo grapheme_substr($string, 0, 3), "\n"; // noë
0 голосов
/ 20 марта 2019

Вы должны использовать многобайтовую функцию substr().

Попробуйте

<?php
$string = '<p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p>p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p>';

echo mb_substr(strip_tags(trim(html_entity_decode($string,   ENT_COMPAT, 'UTF-8'))), 0, 14);;

?>

Ref | Демо

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