Когда я запускаю этот код
$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ş�
в чем моя ошибка?
я получаю этот результат, если не подстрока. asd
каков ваш ожидаемый результат?
pelaminnasd213123wqeqweqwrqasdppelaminnasd213123wqeqweqwrqasdppelaminnasd213123wqeqweqwrqasdp это ваш ожидаемый результат?






Вы должны использовать многобайтовую функцию 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);;
?>
Вызов неопределенной функции mb_substr() я получаю эту ошибку.
Вам нужно включить расширение mbstring PHP
Во-первых, всегда разбивает вашу проблему на более мелкие части, чтобы увидеть, где она идет не так:
$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 Кодовые точки Юникода, поэтому все еще может делать странные вещи, такие как отрезать ударение от буквы, если она была закодирована с использованием «комбинированного диакритического знака».
Альтернативой в некоторых случаях может быть использование 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ë
ваш ожидаемый результат
pelaminnasd213123wqeqweqwrqasdppelaminnasd213123wqeqweqwrqasdppelaminnasd213123wqeqweqwrqasdp?