Рекомендуется избегать разметки mb_strimwidth () в середине многосимвольного html специального символа - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть строка, которая была обрезана для заголовков в блоге, и в целом она работала нормально с помощью встроенной функции PHP mb_strimwidth ().

Затем внезапно пользователь сделал сообщение на веб-сайт, который имел название, которое включало апостроф.

Апостроф выводится как ', и проблема в том, что длина символа строки заголовка в этом конкретном примере попала прямо в середину этого специального символа из 7 апострофов chr.

Таким образом, заголовок в конечном итоге появился на сайте как-то вроде ...

Это тестовый заголовок, чтобы показать вам, как апостроф разрезали пополам R

Есть ли стратегия по-прежнему использовать mb_strimwidth (), избегая подобного рода ситуаций?

1 Ответ

1 голос
/ 27 апреля 2020

Ваши данные не содержат фактических , они содержат строковое представление объекта ’. Если вы хотите, чтобы mb_strimwidth() заботился об этом, вам необходимо преобразовать его обратно из представления сущности. Или, в идеале, предпринять шаги, чтобы убедиться, что у вас нет неожиданных представлений сущностей в ваших исходных данных. [См .: UTF-8 на всем пути до ]

$input = "This is a test title to show you how the apostrophe was being cut in half ’ oh noes";

var_dump(
    $input,
    mb_strimwidth($input, 0, 78),
    $decoded = html_entity_decode($input),
    mb_strimwidth($decoded, 0, 78)
);

Выход:

string(89) "This is a test title to show you how the apostrophe was being cut in half ’ oh noes"
string(78) "This is a test title to show you how the apostrophe was being cut in half &#82"
string(85) "This is a test title to show you how the apostrophe was being cut in half ’ oh noes"
string(80) "This is a test title to show you how the apostrophe was being cut in half ’ oh"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...