Я хотел бы обрезать строку до определенного количества символов. Эта строка содержит HTML-символы. Обратите внимание, что я удалил все html-теги из строки. Теперь, если в точке останова есть специальный символ, он должен прерываться не в середине символа html, а после или до. Эти примеры не работают:
//example 1
$str = "French for French is français";
$str = substr($str, 0, 27);
//$str contains "French for French is fran&c";
//example 2
$str = "the en dash looks like –";
$str = substr($str, 0, 25);
//$str contains "the en dash looks like &#";
Поэтому я решил сначала преобразовать специальные символы в отдельные символы, выполнить усечение, а затем преобразовать отдельные символы в специальные символы. Кажется, работает в первом примере, но не во втором.
//example 1
$str = "French for French is français";
$str = html_entity_decode($str);
$str = substr($str, 0, 27);
$str = htmlentities($str);
//$str contains "French for French is frança";
//example 2
$str = "the en dash looks like –";
$str = html_entity_decode($str);
$str = substr($str, 0, 25);
$str = htmlentities($str);
//$str contains "the en dash looks like &#";
Что я должен изменить, чтобы оба примера вели себя так, как я ожидал?
htmlentities использует ваш default_charset
Значение php.ini для его кодировки по умолчанию. Если вы не используете кодировку, которая поддерживает преобразовываемые объекты, она может работать не так, как ожидалось. Попробуйте это и посмотрите, если вы получите другие результаты.
htmlentities($str, null, 'utf-8');
html_entity_decode($str, null, 'utf-8');
mb_substr($str, 0, 25, 'utf-8');
Других решений пока нет …