@Alk90
php, mysql, jquery, css, html, api

Как обрезать текст не обрезая нужные элементы?

Всем привет! Нужно обрезать текст до 35 символов:
текст текст текст текст [IMG=sdfsd7fsdf7dfb7dfb.jpg] текст текст текст текст

Использую функцию mb_strsub($str, 0, 35, 'UTF-8')
Но последний символ попадает на BB код и получается кусок BB кода. Как сделать, чтобы дать понять программе, что тег не нужно обрезать:
1 - его нужно оставить и обрезать текст после него
2 - его можно удалить и обрезать текст до тега
  • Вопрос задан
  • 30 просмотров
Решения вопроса 1
  • @Tarik02
    Есть два варианта решения вашей проблемы:
    1. обрезать просто как текст и потом закрывать открытые теги
    2. полностью парсить структуру текста с BB-кодами, а потом обрезать только текст
    Пример первого варианта
    <?php
    function activateBbTags($str) {
        $str = preg_replace('{\[b\](.+?)\[/b\]}', '<b>$1</b>', $str);
        $str = preg_replace('{\[i\](.+?)\[/i\]}', '<i>$1</i>', $str);
        $str = preg_replace('{\[color=(.*?)\](.+?)\[/color\]}', '<font color="$1">$2</font>', $str);
        return $str;
    }
    
    /**
     * close all open xhtml tags at the end of the string
     *
     * @author Milian Wolff <[url]http://milianw.de[/url]>
     * @param string $html
     * @return string
     */
    function closetags($html){
        #put all opened tags into an array
        preg_match_all("#<([a-z]+)( .*)?(?!/)>#iU",$html,$result);
        $openedtags=$result[1];
    
        #put all closed tags into an array
        preg_match_all("#</([a-z]+)>#iU",$html,$result);
        $closedtags=$result[1];
        $len_opened = count($openedtags);
        # all tags are closed
        if(count($closedtags) == $len_opened){
            return $html;
        }
        $openedtags = array_reverse($openedtags);
        # close tags
        for($i=0;$i<$len_opened;$i++) {
            if (!in_array($openedtags[$i],$closedtags)){
                $html .= '</'.$openedtags[$i].'>';
            } else {
                unset($closedtags[array_search($openedtags[$i],$closedtags)]);
            }
        }
        return $html;
    }
    
    function conciseStr($str, $maxLength, $endChar){
        if (strlen($str) <= $maxLength) return closeTags(activateBbTags($str));
        $str = activateBbTags($str); // Ваша функция, которая активирует нужные бб-тэги
        $str = substr($str, 0, strpos($str, $endChar, $maxLength));
        $str = closeTags($str); // Эта функция выше
        return $str;
    }
    
    $text = 'текст текст текст текст [IMG=sdfsd7fsdf7dfb7dfb.jpg] текст текст текст текст';
    echo conciseStr($text, 35, " ");
    Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы