php mb substr не работает
Неработает substr
substr()
по каким причинам код такого характера substr($name_site, 0, 4); Обрезает лишь два символа вместо.
Функция substr()
Есть функция substr() в php, которая возвращает подстроку. Как сделать так, чтобы при вырезании.
substr не работает
Привет! Хочу срезать текст до 100 символов. substr(0,100,$str);но ф-я ничего не возвращает. если.
NIKOLAYY, у Вас наверное кодировка UTF-8? Эта функция в кодировке UTF-8 не будет корректно работать.
Добавлено через 2 минуты
Используйте mb_substr()
Понял, попробую так.
Всё правильно работает, просто у Вас не установлено расширение php mbstring.
Добавлено через 1 минуту
Хотя может установлено, но не включёно. Найдите в php.ini такую строку:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Substr с переменной
при использовании функции substr не получается вывести данные с другой переменной вот сам код, в.
Баг функции substr
При значение length = 10, вылазит знак вопроса. Чем-то напоминает ошибку в кодировке символов. Не.
Substr с конца строки
$a = substr($string, strrpos($string, ‘(‘)+1); Как изменить данную функцию, чтобы обрезало с конца.
некорректный результат substr и mb_substr для строк включающие бинарные данные
Acraft
Новичок
некорректный результат substr и mb_substr для строк включающие бинарные данные
Доброго времени суток.
Возникла следующая проблема
в PHP 5.2.6 функции mb_substr() и substr() некорректно вырезают часть данных, если эти данные имеют хоть один символ кириллицы, не закодированный в UTF8.
Из-за этого этими функциями невозможно вырезать нужный кусок из бинарных данных.
Этого бага нет в версии PHP 5.2.5 и 4.4.1
В чём может быть проблема?
p.s.: Видимо первый вариант поста был немного расплывчато сформулирован. Поэтому заменил содержимое.
dimagolov
Новичок
Acraft
Новичок
dimagolov
Новичок
Acraft
Новичок
Cоединение инициирует удалённая сторона. Этот скрипт только слушает и выбрасывает в поток echo
В версиях PHP отличных (5.2.5, 4.4.1) от 5.2.6 обработка бинарных данных строковыми ф-ями проходит успешно.
Новичок
Substr всегда использовался для вырезания части из бинарных данных.
Скажи, как еще можно вырезать кусок из бинарных данных?
Конечно, без fopen+ fseek+ fread.
Вот еще вариант вырезать-
If you need to divide a large string (binary data for example) into segments, a much quicker way to do it is to use streams and the php://memory stream wrapper.
For example, if you have a large string in memory, write it to a memory stream like
Working with large data sets, mine was 21MB, increased the speed several factors.
dimagolov
Новичок
Frog, присоединяюсь к разработчикам php. У меня баг не воспроизводится что на Win32 (дистрибут с php.net) что на FreeBSD amd64 (из портов, ясный пень), на i386 обломался уже проверять. Ты сам дал ссылку, а проверить не пробовал?
Acraft, учитывая вышеизложенное, вы совершенно зря не любите кошек, вы просто не умеете их готовить (с). протестируйте код из баг-репорта или предложите свой вариант. я вообще не удивлюсь, если у вас какой-то русский апач или сухосин, которые бьют данные до попадания их в пхп и я бы начинал проверки с этого.
Новичок
У Acraft баг есть- если он в здравом уме, то баг имеет место быть, проверять просто нет смысла (что, проверять врет Acraft или нет?).
Есть смысл пробовать повторить разработчикам, только для того, чтобы его исправить.
Главное условие для повторения бага- в бинарных данных, из которых вырезают substr(), должен быть хотя бы один символ кириллицы, т.е. хотя бы одна русская буква.
tony2001
TeaM PHPClub
Новичок
tony2001
TeaM PHPClub
dimagolov
Новичок
Новичок
Он потер код для того, чтобы коротко и внятно описать суть вопроса, не заставляя посетителей форума разгребать его сырой код для того, чтобы понять что ему надо.
Простое описание, ниже будет еще особенность:
$str=»testабв»; //строка в Win1251
echo substr($str,0,5);
выводит: testабв, а должен testа
а вот это, естественно, работает:
$str=iconv(«Win1251″,»UTF8″,»testабв»); //строка в UTF
echo substr($str,0,5);
выводит: testа
$str=iconv(«Win1251″,»UTF8″,»testабв»); //строка в UTF
echo mb_substr($str,0,5);
выводит: testа
И вот особенность- баг наблюдается только тогда, когда позиция, начиная с которой надо вернуть строку, находится после хотябы одной русской буквы, т.е.:
$str=»testабв»; //строка в Win1251
echo substr($str,0,3);
выводит: tes
$str=»testабвtest»; //строка в Win1251
echo substr($str,8,3);
выводит: строку из космоса, а должен: est
Еще раз напомню- в проверенных Acraft-ом версиях PHP 5.2.5, 5.1.6, 4.4.1 бага нет,
т.е. в указанных версиях
$str=»testабв»; //строка в Win1251
echo substr($str,0,5);
выводит: testа
tony2001
TeaM PHPClub
давайте с самого начала.
если включен mbstring overloading и надо работать с бинарными данными, то можно пользоваться mb_orig_* функциями, это оригинальные строковые функции, без mbstring.
Новичок
Но я лично говорю о том, что такое поведение substr() встречается у него только в 5.2.6, в других версиях PHP все отлично работает.
Просто лично мое мнение- проще и быстрее установить версию PHP, в которой этих проблем нет.
Конечно, может быть, поигравшись с настройками и кодом, можно заcтавить работать скрипт и в 5.2.6.
Но лично мое мнение- зачем?
Если у тебя много времени, ты очень молод, полон сил, собираешься жить до 100 лет и при этом тебе приносят каждый месяц домой деньги на блюдечке, а скрипт ты делаешь только для своего удовольствия- конечно, можно, а если нет- надо написать баг репорт, переставить версию PHP на работающую и зарабатывать своим трудом дальше.
tony2001
TeaM PHPClub
>Конечно, может быть, поигравшись с настройками и кодом, можно заcтавить
>работать скрипт и в 5.2.6.
>Но лично мое мнение- зачем?
действительно, зачем исправлять проблемы? зачем фиксить баги? зачем?
>Если у тебя много времени, ты очень молод, полон сил, собираешься жить до 100
>лет и при этом тебе приносят каждый месяц домой деньги на блюдечке, а скрипт ты
>делаешь только для своего удовольствия- конечно, можно, а если нет- надо
>написать баг репорт, переставить версию PHP на работающую и зарабатывать
>своим трудом дальше.
меньше текста, плз.
вы вдвоём пока даже и баг-репорт не смогли составить.
Новичок
Топик начал Acraft, после чего я нашел за него описание бага в сети и вместе с ним локализовали проблему-
выше я написал код с описанием.
>действительно, зачем исправлять проблемы? зачем фиксить баги? зачем?
Исправлять проблемы- это два утверждения- исправлять баги и решать проблемы.
Я сказал- надо решать проблемы.
Фиксить баги- ни я ни Вы ни Acraft не пофиксят ни одного бага в PHP 5.2.6.
>меньше текста, плз.
>вы вдвоём пока даже и баг-репорт не смогли составить.
Лично мне это не нужно.
Acraft может и составит, если у него будет на это время.
Только для того, что бы баг, может быть, когда-то исправили.
Но на его работу это влиять не должно.
Да, Tony, с возрастом ты стал более нетерпимым к новичкам..
tony2001
TeaM PHPClub
>Фиксить баги- ни я ни Вы ни Acraft не пофиксят ни одного бага в PHP 5.2.6.
я не смогу вернуться в прошлое, это правда.
но это не означает, что надо просто забыть и жить с 5.2.5, исправить 5.2.7 до его выхода лично мне вполне по силам.
если, конечно, мне объяснят нормально проблему, а не будут разводить демагогию.
это возможно или мне надо дальше тратить время на разговоры?
>Да, Tony, с возрастом ты стал более нетерпимым к новичкам..
всё это прекрасно, но нельзя ли перейти к делу?
Новичок
Вобщемто, как я уже сказал, это не мой проект и не моя проблема.
Насколько я знаю, Acraft будет переставлять версию на 5.2.5, просто потому, что ему надо быстрее завершать проект.
Если это чему-то поможет, то код, показывающий баг, я написал, но про настройки PHP ничего не знаю.
Если Acraft захочет- он напишет, тогда, возможно, весь этот разговор и будет иметь и смысл и результаты.
Лично от меня- извинения за болтовню и недостаточность данных.
Думаю, надо только ждать ответа от Acraft о настройках PHP.
Acraft
Новичок
Основные настройки PHP 5.2.6 на котором наблюдается баг.
; Language Options ;
;;;;;;;;;;;;;;;;;;;;
engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision = 14
y2k_compliance = On
output_buffering = 4096
output_handler = ob_gzhandler
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
expose_php = On
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 60
max_input_time = 60
memory_limit = 60M
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
error_reporting = E_ALL &
E_NOTICE
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
; Data Handling ;
;;;;;;;;;;;;;;;;;
variables_order = «EGPCS»
register_globals = On
register_long_arrays = Off
register_argc_argv = On
post_max_size = 8M
magic_quotes_gpc = On
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = «text/html»
always_populate_raw_post_data = On
[mbstring]
mbstring.internal_encoding = UTF-8
такой способ (попробовать в конце-концов стоило) тоже ничего дельного не принёс:
Функции для работы с многобайтовыми строками
Схемы многобайтного кодирования символов и их реализации достаточно сложны, и их описание находится за пределами этой документации. Более исчерпывающую информацию о кодировках и их устройстве можно почерпнуть из нижеприведённых источников.
Материалы по Юникоду
Информация о символах японской/корейской/китайской кодировок
Содержание
User Contributed Notes 35 notes
Please note that all the discussion about mb_str_replace in the comments is pretty pointless. str_replace works just fine with multibyte strings:
= ‘漢字はユニコード’ ;
$needle = ‘は’ ;
$replace = ‘Foo’ ;
?>
The usual problem is that the string is evaluated as binary string, meaning PHP is not aware of encodings at all. Problems arise if you are getting a value «from outside» somewhere (database, POST request) and the encoding of the needle and the haystack is not the same. That typically means the source code is not saved in the same encoding as you are receiving «from outside». Therefore the binary representations don’t match and nothing happens.
PHP can input and output Unicode, but a little different from what Microsoft means: when Microsoft says «Unicode», it unexplicitly means little-endian UTF-16 with BOM(FF FE = chr(255).chr(254)), whereas PHP’s «UTF-16» means big-endian with BOM. For this reason, PHP does not seem to be able to output Unicode CSV file for Microsoft Excel. Solving this problem is quite simple: just put BOM infront of UTF-16LE string.
SOME multibyte encodings can safely be used in str_replace() and the like, others cannot. It’s not enough to ensure that all the strings involved use the same encoding: obviously they have to, but it’s not enough. It has to be the right sort of encoding.
UTF-8 is one of the safe ones, because it was designed to be unambiguous about where each encoded character begins and ends in the string of bytes that makes up the encoded text. Some encodings are not safe: the last bytes of one character in a text followed by the first bytes of the next character may together make a valid character. str_replace() knows nothing about «characters», «character encodings» or «encoded text». It only knows about the string of bytes. To str_replace(), two adjacent characters with two-byte encodings just looks like a sequence of four bytes and it’s not going to know it shouldn’t try to match the middle two bytes.
While real-world examples can be found of str_replace() mangling text, it can be illustrated by using the HTML-ENTITIES encoding. It’s not one of the safe ones. All of the strings being passed to str_replace() are valid HTML-ENTITIES-encoded text so the «all inputs use the same encoding» rule is satisfied.
The text is «x = ‘x ;
mb_internal_encoding ( ‘HTML-ENTITIES’ );
?>
Even though neither ‘l’ nor ‘;’ appear in the text «x y» and in the other it broke the encoding completely.
One more reason to use UTF-8 if you can, I guess.
Yet another single-line mb_trim() function
PHP5 has no mb_trim(), so here’s one I made. It work just as trim(), but with the added bonus of PCRE character classes (including, of course, all the useful Unicode ones such as \pZ).
PHP: substr и мощные альтернативы, чтобы вырезать часть строки
Поговорим о том, как обрезать строку в PHP. Функция substr в предназначена для получения части строки. Она выделяет подстроку из переданной строки и возвращает её. Для этого нужно указать строку, порядковый номер символа, начиная с которого нужно вырезать строку, порядковый номер символа, до которого мы верезаем подстроку.
Обратите внимание, что substr неправильно работает с многобайтовыми кодировками, поэтому мы будем использовать mb_substr, которая работает с ними корректно. Об этой проблеме немного ниже.
Теперь перейдем к примерам.
Получаем строку начиная с определенного символа
Мы вырезали первые 8 символов из строки, содержащей URL адрес.
Получаем определенное количество символов
Теперь давайте вырежем еще и «/admin/» в конце.
Мы бы могли сделать это указав количество символов, которое нужно взять, оно равно количеству символов в домене, их 11
Вырезаем символы с конца
Что если мы не знаем количества символов в домене, но знаем что нужно вырезать строку «/admin/», длина которой составляет 7 символов? Иными словами нам нужно вырезать с конца.
В таком случае нужно указать отрицательное число:
Получаем несколько последних символов
Что если нам нужно вернуть наоборот только 7 последних символов? Тогда код будет следующим:
Получаем первый символ строки
Получаем последний символ строки
Получение подстроки по регулярному выражению
Проблема при работе с многобайтовыми кодировками.
Рассмотрим такой пример:
Что случилось? Почему в первом случае, где мы использовали mb_substr все сработало хорошо, а во втором случае вернулся какой-то битый символ?
Дело в том, что в UTF-8 кириллица кодируется 2 байтам, вместо одного. substr считает, что символ равен байту и поэтому вырезает 3 байта с начала. Таким образом она вырезала букву «П», и только половину буквы «Р». В общем вы поняли: всегда используйте mb_substr когда работаете с текстом, который потенциально может содержать многобайтовые символы.
Продвинутая работа со строками
Если вы часто работаете со строками, вам пригодится это расширение: symfony/string
С его помощью вы сможете легко вырезать строки. Взгляните на несколько примеров:
mb_substr () возвращает пустую строку, ЕСЛИ последние два параметра не указаны
Я получаю действительно странные результаты от mb_substr() это идет вразрез с тем, что в документации описывается как ожидаемое поведение: когда я передаю последние два параметра, mb_substr() возвращает пустую строку. Если я опускаю последние два параметра полностью, он возвращает ожидаемый результат. Что-то мне не хватает или что-то не так с моим синтаксисом? РЕДАКТИРОВАТЬ: Мне интересно, может ли это происходить из-за настроек сервера, поскольку этого не происходило, когда мой код был на локальном сервере с использованием MAMP.
Документация:
length
Максимальное количество символов для использования от ул. Если пропущено или передано значение NULL, извлеките все символы до конца строки.
Мой код:
Ожидаемое поведение:
Фактические результаты:
Мой модифицированный код:
Фактические результаты:
Решение
Все зависит от версии PHP, которую вы используете. Я только что проверил это на своем локальном хосте, меняющем версии PHP.
Для следующего кода:
PHP 5,6 выходы: mb2: I am a string
PHP 5.5.11 выходы: mb2: I am a string
PHP 5.4.31 выходы: mb2: I am a string
PHP 5.3.29 выходы: mb2:
Таким образом, кажется, что в предыдущих версиях PHP была ошибка, или документация PHP изменилась, и ранее была другая документация для PHP.
А для создания безопасного кода (работающего также в PHP 5.3) вы можете использовать:
Это даст одинаковый результат во всех версиях PHP 5.3+
РЕДАКТИРОВАТЬ
Смотря на PHP Changelog ты можешь читать:
Разрешить передачу нулевого значения в качестве значения по умолчанию для mb_substr () и mb_strcut (). Патч Александра Москалёва через GitHub PR # 133.
по состоянию на 5.4.8 так что с этой версии должно нормально работать
Другие решения
Это правильный способ его использования. Как говорится в комментарий s, передавая как NULL, интерпретирует его как 0.