как заменить ' другим специальным символом, используя str_replace php

У меня есть функция, которая получает заголовок сообщения и обрезает его, когда заголовок сообщения длиннее 40 символов. Функция работает очень хорошо, за исключением случаев, когда в строке есть '.

Вот как браузер отображает заголовок на исходной странице (до «обрезки»)

dall'high-tech all'high-car, bla bla bla bla bla bla bla bla bla bla bla

Когда строка передается функции и функция обрезает ее на 40-м символе, возвращаемая строка очень короткая:

dall'high-tech

Я использую substr(), чтобы вырезать его после 40-го символа:

substr($my_string, 0, 40);

Я думаю, что проблема связана с символом ' в строке. Я попытался заменить символ ' на chr(134), используя

str_replace("'", chr(134), $my_string);

Но str_replace() не может заменить ' на . (Я пробовал также использовать \' и chr(39) вместо ', а также использовать B вместо chr(134)).

Итак, теперь я не знаю, что делать. Я потратил уже 5 часов, пытаясь решить эту проблему. Я уверен, что кто-то прошел через это раньше и может помочь мне.

Спасибо


person user1232551    schedule 19.03.2012    source источник
comment
Проверьте: codepad.org/EU4e1q89.   -  person hjpotter92    schedule 19.03.2012
comment
Это символы Юникода? Вы уверены, что ' на самом деле ', а не какой-либо другой подобный символ Unicode?   -  person Shiplu Mokaddim    schedule 19.03.2012


Ответы (1)


Попробуйте сделать это перед выполнением substr():

$my_string = html_entity_decode($my_string, ENT_QUOTES);

Другой вариант — использовать mb_substr(), который выполняет многобайтовую безопасную операцию substr() на основе числа персонажей.

person Jeremy Harris    schedule 19.03.2012
comment
какое это имеет отношение к substr? - person Shiplu Mokaddim; 19.03.2012
comment
Для некоторых людей (как я обнаружил во время поиска в Google) это решение. Вероятно, это связано с их набором символов. Честно говоря, мне не удалось воспроизвести поведение с PHP 5.2.11 -› ideone.com/qixOP - person Jeremy Harris; 19.03.2012
comment
@Shiplu OP пытался использовать substr, но это действительно может привести к сбою в многобайтовых строках, оставив вам только один байт многобайтового символа в конце строки. - person GolezTrol; 19.03.2012
comment
ваше последнее дополнение к ответу (mb_substr) теперь имеет смысл. - person Shiplu Mokaddim; 19.03.2012
comment
@GolezTrol Я прокомментировал до того, как Cillosis добавил mb_substr часть. - person Shiplu Mokaddim; 19.03.2012
comment
$my_string=str_replace(chr(39), B, $my_string); if (str_word_count($my_string)›0) { $cut_at = strrpos(substr($my_string, 0, $cut_at), ' '); } $my_string = html_entity_decode($my_string, ENT_QUOTES); $my_string_output = mb_substr($my_string, 0, $cut_at); - person user1232551; 19.03.2012