Обрезаем текст определённой длины на PHP

Многие разработчики ломают голову над скриптом, который будет обрезать текст определённой длины. Подобный текст используется в качестве краткого описания к статьям или постам.

Различного рода CMS предоставляют нам готовые решения для подобного рода задач, но почему бы не посмотреть на то, как сделать это самому.

Данную задачу можно решить средствами JavaScript и CSS, однако мы воспользуемся языком PHP.

Возьмём следующий текст:

$string = "<p><strong>Richard III</strong> (2 October 1452 – 22August 1485) was King of England for two years, from 1483 until his death in 1485 in the Battle of Bosworth Field. He was the last king of the House of York and the last of the Plantagenet dynasty. His defeat at Bosworth Field, the decisive battle of the Wars of the Roses, is sometimes regarded as the end of the Middle Ages in England. He is the subject of the play<cite>Richard III</cite> by <a href=//en.wikipedia.org/wiki/William_Shakespeare>William Shakespeare.</a>"

Первым делом, уберём все html элементы:

$string = strip_tags($string);

Теперь обрежем его на определённое количество символов:

$string = substr($string, 0, 200);

Затем убедимся, что текст не заканчивается восклицательным знаком, запятой, точкой или тире:

$string = rtrim($string, "!,.-");

Напоследок находим последний пробел, устраняем его и ставим троеточие:

$string = substr($string, 0, strrpos($string, ' '));
echo $string."… ";

Результат будет такой:

Richard III (2 October 1452 – 22 August 1485) was King of England for two years, from 1483 until his death in 1485 in the Battle of Bosworth Field. He was the last king of the House of York and the…

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://demosthenes.info/blog/703/Build-Better-Text-Extracts-With-PHP
Перевел: Станислав Протасевич
Урок создан: 19 Июня 2013
Просмотров: 81089
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 20 Июня 2013 01:26
    lienus
    пасиба, как раз пишу то же самое, а тут готово)))
  • 20 Июня 2013 06:15
    tarantull565
    Спасибо большое)
  • 20 Июня 2013 07:36
    Акбар Saydrecks
    Спасибо, пожалуйста сделайте урок, как в комментариях добавить фотографию и видео с ютуб используя AJAX. Ссылка на ресурс: http://www.saaraan.com/2012/09/ajax-multiple-image-upload-resize-with-jquery-and-php Очень прошу, заранее спасибо
  • 20 Июня 2013 08:17
    art_gur
    Спасибо! Пригодиться мне такая фича на сайте.
  • 20 Июня 2013 08:45
    djArf
    Почему-то не упомянуты особенности работы с текстом в UTF-8, а они есть...
    • 20 Июня 2013 09:20
      ppaull
      Просвятите нас - какие там особенности для конкретного примера?
      • 20 Июня 2013 09:32
        Андрей87
        php очень часто не правильно обрезает строку в utf8 (да и не только обрезает, с юникодом у php вообще масса глюков при работе со строками, по крайней мере при работе с кирилическим текстом) это особенность языка. Поэтому в подобных функция рекомедуеться сначала поменять кодировку например iconv("utf-8", "windows-1251", $string); ну а после обрезки поменять опять в utf8, после этого все будет коректно. ИМХО вообще качество уроков последнее время упало ниже плинтуса. Тупо переводы с иностранных ресурсов да еще и низкого качества, чего то своего крайне мало. Я лично смотрю здесь только jquery + css. Php на руселере уж очень слабо знают.
        • 20 Июня 2013 14:51
          jeronimmo
          Для utf8 лучше использовать mb_substr() вместо substr(). Сам её давно юзаю, отображение символов всегда правильное, т.е. не каверкает буквы.
        • 24 Июня 2013 07:31
          PROGRAMMATOR
          > с юникодом у php вообще масса глюков при работе со строками Да, в 2005 php был именно таким...
  • 20 Июня 2013 09:36
    airarm
    Для кириллицы лучше обрезать текст вот так )))
    function str_size($str,$length)
    { $str = iconv("UTF-8","windows-1251", $str); $str = substr($str, 0, $length); $str = iconv("windows-1251", "UTF-8", $str); $str .= "..."; return $str;
    }
    
    • 20 Июня 2013 09:43
      Андрей87
      да об этом я написал. В простом варианте, без учета на что оканчивается строка и если не стоит цели сохранить целостность последнего слова.
    • 20 Июня 2013 11:23
      aldem67
      Для кириллицы лучше как-то mb_* использовать, а не изгаляться.
      • 20 Июня 2013 17:47
        spaiter
        Ещё есть нюанс с кириллицей в utf8, например чтобы сделать строку с заглавной буквы можно пользоваться этим методом: странно не дает вставить код...
  • 20 Июня 2013 09:47
    dimaloll
    Как сделать тоже самое, только не убирая все теги, то есть не используя эту ф-цию ---
    $string = strip_tags($string);
    Как отследить закрытие всех тегов, и тд...??
  • 20 Июня 2013 11:30
    asizintsev
    ей богу вы прям как в воду глядели! как-раз нужно!
  • 20 Июня 2013 16:36
    newrus
    Спасибо! Использую уже :) Заменил свой код для обрезки. Этот универсальней ;) mb_substr() режет корректно :)
  • 30 Июня 2013 00:58
    Alias Priler
    $stext=(mb_strlen($cat['tile'],'UTF-8')>15) ? trim(mb_substr($cat['tile']
    ,0,15,'UTF-8')).'...':mb_substr($cat['tile'],0,15,'UTF-8')
    Вот так будет получше :)
  • 29 Июля 2013 10:41
    soft91
    У меня вопрос такой как на страницу сайта сверху сделать динамическую строку переходов ну типа Главная » Уроки » PHP» и т.д. Заранее благодарен!
    • 29 Июля 2013 10:49
      stas.protasevich
      это называется "хлебные крошки".
      • 29 Июля 2013 11:10
        soft91
        а как этого добиться на php
        • 29 Июля 2013 11:55
          stas.protasevich
          не знаю, есть ли у нас уроки по этой теме, но в сети точно есть. Можете поискать, пока у нас не появится.
  • 3 Сентября 2014 02:20
    pnypho
    Спасибо, помогло)
  • 12 Февраля 2016 20:30
    koksnull
    Я думаю лучше использовать функцию mb_substr так как если будет кодировка UTF-8, то функция substr будет возвращать не корректный текст.
^ Наверх ^