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

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

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

Использую функцию mb_strsub($str, 0, 35, 'UTF-8')
Но последний символ попадает на BB код и получается кусок BB кода. Как сделать, чтобы дать понять программе, что тег не нужно обрезать:
1 - его нужно оставить и обрезать текст после него
2 - его можно удалить и обрезать текст до тега
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
Есть два варианта решения вашей проблемы:
  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
@grinat
Ну если регулярка не устраивает, то просто перебирай посимвольно, данный сохраняй, если открытый bbcode обнаружен то игнорь пока не закроется, либо разбирай то что там, если нужно сохранить. Проще регулярку, этот поимвольный разбор есть смысл применять если кусок такого размера, что нет памяти
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы