Как я могу получить первые n символов строки в PHP? Какой самый быстрый способ обрезать строку до определенного количества символов и добавить «...», если необходимо?
Прошло много времени с тех пор, как я написал этот ответ, и я больше не использую этот код. Я предпочитаю эту функцию, которая предотвращает разрыв строки в середине слова, используя wordwrapфункцию:
может быть лучше заменить многоточием (…), а не 3 точками (...)
Keet
3
Я люблю это, но я изменил его и использую следующее, чтобы удалить пробелы в конце: $ string = substr (trim ($ string), 0,10) .'... '; Таким образом, вы получите что-то вроде «мне нравится ...» вместо «мне нравится ...».
Кентон де Йонг
28
"hellip" - мне понадобилось время, чтобы понять, что мы не говорим о IP-адресе сатаны
Лукас Бернардо де Соуза
2
Обновление 3 является наиболее полезным.
Мильковский
В случае жесткого ограничения длины возвращаемой строки, разве не должна быть строка 5 обновления 3 $string = wordwrap($string, $length - sizeof($append)); ?
Майкл Креншоу
115
Эта функциональность была встроена в PHP начиная с версии 4.0.6. Смотрите документы .
Работал отлично для меня. Верхний ответ не сработал, и я рад, что не сработал, потому что продолжал прокручивать и нашел этот драгоценный камень.
Эдуардо
Спасибо, я всегда использовал этот более длинный и старый метод!
gr3g
1
Дэн, ты мог бы хотеть быть более конкретным о том, какая часть топ-ответа тебе не подходит. Функция truncate () отлично сработала для меня, и преимущество этого ответа перед ответом Бруховского состоит в том, что оно ломается по границам слова; при условии, что вы заботитесь о таких вещах.
pdwalker
2
хороший улов! многие опытные разработчики PHP не знают об этой функции :)
jroi_web
1
Верхний (прямо сейчас) ответ ( stackoverflow.com/a/3161830/236306 ) ничего не сделал (как будто я вообще не использовал fn). Не знаю почему. Этот ответ, однако, кажется идеальным и пришел с дополнительным преимуществом работы.
Алан
15
Многобайтовое расширение может пригодиться, если вам нужен контроль над строковым набором символов.
$charset ='UTF-8';
$length =10;
$string ='Hai to yoo! I like yoo soo!';if(mb_strlen($string, $charset)> $length){
$string = mb_substr($string,0, $length -3, $charset).'...';}
Этот код добавляет три точки в строку? В моем коде есть тег ссылки <a>, и, когда я скомпоную его, он свяжет его с тремя точками, которые будут иметь другое значение.
Fello
9
иногда вам нужно ограничить строку последним полным словом, т.е. вы не хотите, чтобы последнее слово было разбито, вместо этого вы останавливаетесь на втором последнем слове.
Например: нам нужно ограничить «Это моя строка» до 6 символов, но вместо «Это я ...» мы хотим, чтобы это было «Это ...», т.е. мы пропустим эти пропущенные буквы в последнем слове.
если $ str короче, чем $ n_chars, возвращает его нетронутым.
Если $ str равен $ n_chars, возвращает его как есть.
если $ str длиннее, чем $ n_chars, то он ищет следующий пробел или (если больше нет пробелов до конца) вместо этого $ str грубо обрезается в $ n_chars.
ПРИМЕЧАНИЕ: имейте в виду, что этот метод удалит все теги в случае HTML.
Платформа codeigniter содержит помощник для этого, называемый «текстовый помощник». Вот некоторая документация из руководства пользователя codeigniter, которое применимо: http://codeigniter.com/user_guide/helpers/text_helper.html
(просто прочитайте разделы word_limiter и character_limiter). Вот две функции, относящиеся к вашему вопросу:
Чтобы создать внутри функции (для повторного использования) и динамическую ограниченную длину, используйте:
function string_length_cutoff($string, $limit, $subtext ='...'){return(strlen($string)> $limit)? substr($string,0,($limit-strlen(subtext))).$subtext : $string;}// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia',26);// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia',26,'..');
Это не сработает, потому что trim () уже существует.
Гордон
Могли бы объяснить, почему этот подход лучше, чем просто утверждать, что это так?
Роберт
1
@ Роберт, это просто, и абстрагирование означает, что вам не нужно снова и снова печатать код. И самое главное, если вы найдете лучший способ сделать это или хотите что-то более сложное, вы просто измените эту функцию 1 вместо 50 фрагментов кода.
TravisO
2
Почему функция прописная?
Карло
Исправлено: субстрат $ var, а не $ string. Проверьте, $limit + 3чтобы не обрезать строку только за предел. В зависимости от вашего приложения (например, вывод HTML), рассмотрите возможность использования объекта …(типографски более приятным). Как предлагалось ранее, обрежьте все не-буквы с конца (укороченной) строки перед добавлением многоточия. Наконец, следите, если вы находитесь в многобайтовой (например, UTF-8) среде - вы не можете использовать strlen () и substr ().
Фил Перри
1
Я не уверен, что это самое быстрое решение, но похоже, что оно самое короткое:
это решение не будет сокращать слова, оно добавит три точки после первого пробела. Я отредактировал решение @ Raccoon29 и заменил все функции на функции mb_, чтобы это работало для всех языков, таких как арабский
Если нет строгих требований к длине усеченной строки, это можно использовать для усечения и предотвращения сокращения последнего слова:
$text ="Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/',' ', $text);// truncates the text
$text_truncated = mb_substr($text_only_spaces,0, mb_strpos($text_only_spaces," ",50));// prevents last word truncation
$preview = trim(mb_substr($text_truncated,0, mb_strrpos($text_truncated," ")));
В этом случае $previewбудет "Knowledge is a natural right of every human being".
Ответы:
Обновить:
Основываясь на предложении проверить длину (а также обеспечить одинаковую длину на обрезанных и необрезанных струнах):
Таким образом, вы получите строку длиной до 13 символов; либо 13 (или менее) нормальных символов, либо 10 символов, за которыми следует «...»
Обновление 2:
Или как функция:
Обновление 3:
Прошло много времени с тех пор, как я написал этот ответ, и я больше не использую этот код. Я предпочитаю эту функцию, которая предотвращает разрыв строки в середине слова, используя
wordwrap
функцию:источник
$string = wordwrap($string, $length - sizeof($append));
?Эта функциональность была встроена в PHP начиная с версии 4.0.6. Смотрите документы .
Обратите внимание, что
trimmarker
(многоточие выше) включены в усеченную длину.источник
Многобайтовое расширение может пригодиться, если вам нужен контроль над строковым набором символов.
источник
иногда вам нужно ограничить строку последним полным словом, т.е. вы не хотите, чтобы последнее слово было разбито, вместо этого вы останавливаетесь на втором последнем слове.
Например: нам нужно ограничить «Это моя строка» до 6 символов, но вместо «Это я ...» мы хотим, чтобы это было «Это ...», т.е. мы пропустим эти пропущенные буквы в последнем слове.
уф, я плохо объясняю, вот код.
источник
Если вы хотите сократить осторожность, чтобы не разделить слова, вы можете сделать следующее
если $ str короче, чем $ n_chars, возвращает его нетронутым.
Если $ str равен $ n_chars, возвращает его как есть.
если $ str длиннее, чем $ n_chars, то он ищет следующий пробел или (если больше нет пробелов до конца) вместо этого $ str грубо обрезается в $ n_chars.
ПРИМЕЧАНИЕ: имейте в виду, что этот метод удалит все теги в случае HTML.
источник
Платформа codeigniter содержит помощник для этого, называемый «текстовый помощник». Вот некоторая документация из руководства пользователя codeigniter, которое применимо: http://codeigniter.com/user_guide/helpers/text_helper.html (просто прочитайте разделы word_limiter и character_limiter). Вот две функции, относящиеся к вашему вопросу:
И
источник
Использовать подстроку
http://php.net/manual/en/function.substr.php
источник
источник
Функция, которую я использовал:
Посмотрите это в действии .
источник
Вот что я делаю
где $ num обозначает число символов, а $ tt - строку для манипуляции.
источник
Я разработал функцию для этого использования
Вы просто вызовите функцию шпагатом и Limite
например:
str_short("hahahahahah",5)
;это обрежет вашу строку и добавит "..." в конце
:)
источник
Чтобы создать внутри функции (для повторного использования) и динамическую ограниченную длину, используйте:
источник
Лучше всего абстрагироваться от того, что вы такой код (обратите внимание, что ограничение не является обязательным и по умолчанию равно 10):
источник
$limit + 3
чтобы не обрезать строку только за предел. В зависимости от вашего приложения (например, вывод HTML), рассмотрите возможность использования объекта…
(типографски более приятным). Как предлагалось ранее, обрежьте все не-буквы с конца (укороченной) строки перед добавлением многоточия. Наконец, следите, если вы находитесь в многобайтовой (например, UTF-8) среде - вы не можете использовать strlen () и substr ().Я не уверен, что это самое быстрое решение, но похоже, что оно самое короткое:
PS Смотрите некоторые примеры здесь https://stackoverflow.com/a/17852480/131337
источник
будет лучше использовать substr (), сначала вы захотите проверить длину строки
WordWrap не будет обрезать строку, просто разделить ее ...
источник
ширина = 10;
или с переносом слов
источник
это решение не будет сокращать слова, оно добавит три точки после первого пробела. Я отредактировал решение @ Raccoon29 и заменил все функции на функции mb_, чтобы это работало для всех языков, таких как арабский
источник
источник
Если нет строгих требований к длине усеченной строки, это можно использовать для усечения и предотвращения сокращения последнего слова:
В этом случае
$preview
будет"Knowledge is a natural right of every human being"
.Пример прямого кода: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713
источник