Php substr Utf-8 проблема

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

   $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ş�

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

ваш ожидаемый результат pelaminnasd213123wqeqweqwrqasdppelaminnasd213123wqeqweqwrqas‌​dppelaminnasd213123w‌​qeqweqwrqasdp?

devpro 20.03.2019 10:49

я получаю этот результат, если не подстрока. asd

Samaoru Kiqweoms 20.03.2019 10:51

каков ваш ожидаемый результат?

devpro 20.03.2019 10:51
pelaminnasd213123wqeqweqwrqasdppelaminnasd213123wqeqweqwrqas‌​dppelaminnasd213123w‌​qeqweqwrqasdp это ваш ожидаемый результат?
devpro 20.03.2019 10:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
536
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны использовать многобайтовую функцию 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() я получаю эту ошибку.

Samaoru Kiqweoms 20.03.2019 10:50

Вам нужно включить расширение mbstring PHP

Vidhyut Pandya 20.03.2019 10:51

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

$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ë

Другие вопросы по теме