Php substr неправильно работает

Не правильно работает substr()?

Выводит 44 символа.
wtf? Ничего не могу понять из-за чего такое происходит?

Добавлено через 8 минут
Я как понял ошибка из-за того, что присутствуют пробелы, как исправить?

substr не работает
Привет! Хочу срезать текст до 100 символов. substr(0,100,$str);но ф-я ничего не возвращает. если.

Ошибка с substr(): «substr() expects parameter 1 to be string, array given»
Помогите, не могу понять что не так. Как сделать что-бы заработало? Вот часть кода: $rgrt_one =.

Как работает string-метод — substr(pos,n) ? Помогите найти ошибку!
Помогите найти ошибку: // substr.cpp : Defines the entry point for the console application. // .

Почему не работает правильно? Делал по шаблону (html только начал учить) Кто может подправьте чтобы работало правильно,
Почему не работает правильно? Делал по шаблону (html только начал учить) Кто может подправьте чтобы.

mb_internal_encoding('UTF-8'); $scomment = mb_substr("$com", 0, 40);

Правильно ли написана прога? Работает ли правильно?
Подскажите пожалуйста, правильно ли я написал все три программы?

Надо понять правильно работает код или нет. И работает ли он вообще
Он должен вычислить сумму с точностью эпсилон #include <iostream> using namespace std; .

В Windows Forms некоректно работает метод, хотя в консоли работает правильно
//Данный метод должен заменять все элементы в массиве на 1, после найменьшего. public string.

На Главной странице не работает правильно вывод (неккоректно работает цикл)
Я создал тему с нуля. И мне нужно было чтоб на главной странице(Главная).

Источник

PHP: substr и мощные альтернативы, чтобы вырезать часть строки

Поговорим о том, как обрезать строку в PHP. Функция substr в предназначена для получения части строки. Она выделяет подстроку из переданной строки и возвращает её. Для этого нужно указать строку, порядковый номер символа, начиная с которого нужно вырезать строку, порядковый номер символа, до которого мы верезаем подстроку.

Обратите внимание, что substr неправильно работает с многобайтовыми кодировками, поэтому мы будем использовать mb_substr, которая работает с ними корректно. Об этой проблеме немного ниже.

mb_substr( string $string, int $start, int|null $length = null, string|null $encoding = null ): string
  • $string — строка, из которой мы будем вырезать подстроку
  • $start — символ, с которого мы будем вырезать подстроку
  • $length — сколько символов мы будем вырезать (по умолчанию будем вырезать все оставшиеся)
  • $encoding — кодировка

Теперь перейдем к примерам.

Получаем строку начиная с определенного символа

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 8); echo $result; // результат: phpstack.ru/admin/

Мы вырезали первые 8 символов из строки, содержащей URL адрес.

Читайте также:  Php уничтожить все переменные

Получаем определенное количество символов

Теперь давайте вырежем еще и «/admin/» в конце.

Мы бы могли сделать это указав количество символов, которое нужно взять, оно равно количеству символов в домене, их 11

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 8, 11); // возьмем 11 символов начиная с 8-го echo $result; // результат: phpstack.ru

Вырезаем символы с конца

Что если мы не знаем количества символов в домене, но знаем что нужно вырезать строку «/admin/», длина которой составляет 7 символов? Иными словами нам нужно вырезать с конца.

В таком случае нужно указать отрицательное число:

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 8, -7); // удаляем 8 символов с начала и 7 символов с конца echo $result; // результат: phpstack.ru

Получаем несколько последних символов

Что если нам нужно вернуть наоборот только 7 последних символов? Тогда код будет следующим:

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, -7); // Получаем 7 символов с конца, остальное удаляем echo $result; // результат: /admin/

Получаем первый символ строки

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 0, 1); // Начиная с 0 берем 1 символ echo $result; // результат: h

Получаем последний символ строки

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, -1); // начинаем на 1 символ относительно конца echo $result; // результат: /

Получение подстроки по регулярному выражению

Если вам не хватает возможностей substr, возможно вам необходим более мощный инструмент: preg_match — эта функция позволяет получить подстроки по регулярному выражению.

Проблема при работе с многобайтовыми кодировками.

$url = 'привет'; $result1 = mb_substr($url, 3); // удаляем 3 символа с начала $result2 = substr($url, 3); // удаляем 3 символа с начала var_dump($result1); // вет var_dump($result2); // �ивет

Что случилось? Почему в первом случае, где мы использовали mb_substr все сработало хорошо, а во втором случае вернулся какой-то битый символ?

Дело в том, что в UTF-8 кириллица кодируется 2 байтам, вместо одного. substr считает, что символ равен байту и поэтому вырезает 3 байта с начала. Таким образом она вырезала букву «П», и только половину буквы «Р». В общем вы поняли: всегда используйте mb_substr когда работаете с текстом, который потенциально может содержать многобайтовые символы.

Продвинутая работа со строками

Если вы часто работаете со строками, вам пригодится это расширение: symfony/string

С его помощью вы сможете легко вырезать строки. Взгляните на несколько примеров:

// returns a substring which starts at the first argument and has the length of the // second optional argument (negative values have the same meaning as in PHP functions) u('Symfony is great')->slice(0, 7); // 'Symfony' u('Symfony is great')->slice(0, -6); // 'Symfony is' u('Symfony is great')->slice(11); // 'great' u('Symfony is great')->slice(-5); // 'great' // reduces the string to the length given as argument (if it's longer) u('Lorem Ipsum')->truncate(3); // 'Lor' u('Lorem Ipsum')->truncate(80); // 'Lorem Ipsum' // the second argument is the character(s) added when a string is cut // (the total length includes the length of this character(s)) u('Lorem Ipsum')->truncate(8, '…'); // 'Lorem I…' // if the third argument is false, the last word before the cut is kept // even if that generates a string longer than the desired length u('Lorem Ipsum')->truncate(8, '…', false); // 'Lorem Ipsum'

Источник

Читайте также:  Python classes inherited object

Проблема с обрезанием строки в кодировке utf-8

Иногда случается так, что при обрезке строки с помощью функции substr() в кодировке utf-8 в конце обрезанной строки появляется непонятный символ:

Например:

$stroka = ‘Строка которую мы будем резать’ ;

echo substr ( $stroka , 0 , 40 );

В результате: Строка которую мы буд?

В конце строки появился какой то непонятный символ (у меня этот символ непонятный в виде знака ?), сейчас мы попробуем его убрать.

Когда я впервые столкнулся с етой проблемой, я нашел в интернете информацию о том, что можно использовать функцию mb_substr() , но на моем хостинге она не работала. А выдавала ошибку:

Fatal error: Call to undefined function mb_substr() in Z:\home\www\makannikov.ru\blog.php on line 85

Я несколько часов искал ответ на этот вопрос, но ничего так и не нашел. А оказалось все проще простого!

Я решил реализовать решение этой проблемы изменив кодировку строки перед обрезкой, затем обрезать и вернуть назад в кодировку utf-8 .

$ stroka = iconv ( ‘UTF-8’ , ‘windows-1251’ , $ stroka ); //Меняем кодировку на windows-1251

$ stroka = substr ( $ stroka , 0 , 40 ); //Обрезаем строку

$ stroka = iconv ( ‘windows-1251’ , ‘UTF-8’ , $ stroka ); //Возвращаем кодировку в utf-8

В результате: Строка которую мы буд

Дополнение к статье от 24.03.2012г

Собственная функция substr()

Для того, чтобы не подставлять каждый раз представленный выше код, напишем собственную функцию.

//Назовем функцию » substr_function » — вы можете придумать свое название

function substr_function( $stroka,$chislo )
// $stroka — это текст который будем обрезать
// $chislo — это количество символов, котрое должно остаться при обрезании строки
<
// Если число символов которое мы задаем переменной $chislo меньше чем количество символов в тексте $stroka, то начинаем выполнять следующее.
if( $chislo < strlen( $stroka )) //strlen() - эта функция возвращает кол-во символов в строке
$ stroka = iconv ( ‘UTF-8’ , ‘windows-1251’ , $ stroka ); //Меняем кодировку на windows-1251

$ stroka = substr ( $ stroka , 0 , $chislo ); //Обрезаем строку

$ stroka = iconv ( ‘windows-1251’ , ‘UTF-8’ , $ stroka ); //Возвращаем кодировку в utf-8

//Добавим троеточие после обрезанного текста

Как использовать функцию: substr_function( Сюда вставляем текст или переменную содержащую текст,60 )

echo substr_function( ‘Если ввести сюда текст, то функция обрежет его и подставит вконце троеточие ‘ ,22 )

Результат: Если ввести сюда текст.

Вот и все, как видите многие вещи в PHP можно обходить легкими путями!

DoubleG

Для того, чтобы заработал mb_substr() необходимо подключить в php.ini библиотеку mbstring (раскомментировать строку «extension=php_mbstring.dll» и перезапустить Apache)

А можно было сделать в одну строчку так:

echo iconv_substr($stroka, 0, 40, ‘UTF-8’)

Андрей

DoubleG, спасибо за совет! Так действительно намного проще.

Максим

Спасибо, реально помогло. Быстро и понятно.

Андрей

skywalker

Андрей

Skywalker, да можно использовать mb_substr, но не у всех эта функция работает, поэтому я предложил свой вариант решения этой проблемы, и меня все устраивает, на днях переделаю этот скрипт в функцию, чтобы было еще удобней!!

Читайте также:  Php fopen while feof

арчи

работает. проверил раза4.. ураа. автор .. забегаю отныне к тебе на блог )

вот

DoubleG

Ты гений! Уже больше часа мучаюсь по поводу обрезки и лишнего символа в виде «вопросика в ромбике»

Андрей

Спасибо, в свое время не один часик потратил на решение этой прорблемы, а когда ничего подходящего не нашел, решил сделать по простому. Я теперь эту функцию ко всем своим сайтам подключаю, только чуть чуть доработал её.

В приведенном примере выше у функции substr_function( $stroka,$chislo ) только два значения, а я добавил еще третье, чтобы в обычной функции substr() можно было испоьзовать тоже третье значение.

substr_function( $stroka,$chislo1 ,$chislo2 ) — substr( $stroka,$chislo1 ,$chislo2 )

Елена

СПАСИБИШЕ. Автору статьи, очень выручила.))))))))))))))

Андрей

Сергей

$fraza = mb_substr($row2[‘meta_d’] ,0,40,’UTF-8′).». «;

Александр

Обгромное спасибо! великолепно работает!

Антон

Олег

Работает. =) Спасибо большое.

Alexey

ПапаГот

Спс помог. У меня вообще всё показывалось вопросами.

Coffeeholic

Виталий

слишком много ненужного кода, все проще

$text = mb_substr($text, 0, 17, «utf-8»);

Дмитрий

Cheshir

А если это в начале строки?

substr() везде заменен на mb_substr()

Андрей

Если Вы используете mb_substr(), Вам нужно:

  • либо в саму функцию подставлять кодировку каждый раз mb_substr($val, 0, 1,»utf-8″);
  • либо один раз прописать такую вот строчку: mb_internal_encoding(‘UTF-8’);

антон

помогите сделать что бы на конце небыло знака вопроса

if( strlen( $text ) > $Doska->Config[‘short_echo_max_strlen’] ) $text = substr( $text, 0, $Doska->Config[‘short_echo_max_strlen’] ).»..»;

Андрей

mb_internal_encoding( ‘UTF-8’ ) ; if ( strlen( $text ) > $Doska -> Config [ ‘short_echo_max_strlen’ ] ) $text = mb_substr( $text , 0 , $Doska -> Config [ ‘short_echo_max_strlen’ ] ). «..» ;

Михаил

billgeits86

В статье и комментариях показаны решения, но почему это происходит не объясняется. А все это из-за того, что национальные символы занимают в UTF-8 2 и более байта, а substr работает только с однобайтовыми кодировками и при обрезании строки или извлечении подстроки двухбайтовый символ может обрезаться посередине. В результате при выводе на экран кодек не сможет его правильно интерпретировать (т.к. отсутствует часть символа) и подменит на знак вопроса, обозначая тем самым невозможность конвертации. В статье вы конвертируете строку в cp1251 — однобайтовую кодировку, что в общем случае неправильно, т.к. при такой конвертации вы потеряете символы, которые есть в UTF-8, но нет в cp1251 и вместо них вы получите те же заки ? или пробел (не знаю точно как там в php). Правильнее конвертировать UTF-8 в более широкую кодировку UTF-16 или UTF-32, где символы имеют фиксированный размер, обрезать все лишнее (извлекать подстроку) и конвертировать назад. Как я понимаю iconv и mb_substr именно это и делают и лучше использовать их.

Ваши комментарии!

Немного о нас

Да, действительно теперь я не один. В моей команде работают несколько программистов, дизайнер и отличный SMM специалист.

Так что теперь мы оказываем абсолютно весь спектр услуг, связанный с организацией бизнеса в интернете. Начиная от создания сайта и заканчивая продвижением его в интернете.

Полезные ссылки

Пишите!

ИП Маканников А. Э. © 2008 — 2023 | info@makannikov.ru | +7 (924) 841-09-12
675000, Амурская область, г. Благовещенск, ул. Б.Хмельницкого 42, каб 404

Источник

Оцените статью