Функция на php для обрезки теста?

Всем доброго времени суток! Ребят может кто сможет мне помочь с поиском php функции для обрезки текста в анонсе статьи. Не так давно, в одной из CMS ( не помню точно в какой, возможно в Drupal) мне попалось на глаза одна функция, которая мне очень понравилась, и вот теперь я не могу найти похожего функционала. Работала она примерно так, на вход принимал три параметра (текст, длину, и строку подставляемую в конец обрезанной строки). Полученный текст она крутила в обе стороны, ища в тексте символы конца строки (точки восклицательные знаки, и тд). Если символ конца строки попадал в 90% от нужной длины, строка обрезалось по этому символу. Ели же символа конца строки найдено не было, она добавляла примерно 10% к заданной длине, пробуя найти символ конца строки там. Ну а если же нужного символа так и не удалось найти, функция обрезала текст по заданной длине, учитывая конец слов, и убирая лишние символы (пробелы, запятые, и тд), подставив в конец обрезанной строки переданные в третьем параметром символы (если таковые были переданы ). Раньше она у меня хранилось на компьютере, и вот теперь я не могу ее найти. Опыта в php у меня не так много, по этой причине сам писать не берусь, боюсь накосячить. Возможно кто то видел подобный функционал, и сможет мне помочь.
  • Вопрос задан
  • 632 просмотра
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Сейчас я расскажу тебе про один секретный сайт.
Лохи про него не знают, но по я тебе по секрету расскажу.
Сайт называется google.com.

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

Только, главное, никому больше про этот сайт не рассказывай.
Если все будут про него знать, то роскомнадзор его точно закроет.
Ответ написан
@Makar2
- Функция на php для обрезки теста
Этого ?)

mb_strlen + mb_substr + mb_motherfucker... - играйся сам.
Ответ написан
Комментировать
@RedBuld
function str_cut($html,$max_length=100,$ender=false,$cut_to_word=false)
    {
        $isUtf8 = true;
        $space_ended = true;
        $result_length = 0;
        $position = 0;
        $add_ender = false;
        $tags = array();

        $output = '';

        $re = $isUtf8 ? '{</?([a-z]+)[^>]*>|&#?[a-zA-Z0-9]+;|[\x80-\xFF][\x80-\xBF]*}' : '{</?([a-z]+)[^>]*>|&#?[a-zA-Z0-9]+;}';

        while($result_length < $max_length && preg_match($re, $html, $match, PREG_OFFSET_CAPTURE, $position))
        {
            list($tag, $tag_position) = $match[0];

            $str = substr($html, $position, $tag_position - $position);
            if ($result_length + strlen($str) > $max_length)
            {
                $output .= substr($str, 0, $max_length - $result_length);
                $result_length = $max_length;
                break;
            }

            $output .= $str;
            $result_length += strlen($str);
            if($result_length >= $max_length)
            {
                break;
            }

            if($tag[0] == '&' || ord($tag) >= 0x80)
            {
                $output .= $tag;
                $result_length++;
            }
            else
            {
                $tagName = $match[1][0];
                if($tag[1] == '/')
                {
                    $openingTag = array_pop($tags);
                    assert($openingTag == $tagName);
                    $output .= $tag;
                }
                elseif($tag[strlen($tag) - 2] == '/')
                {
                    $output .= $tag;
                }
                else
                {
                    $output .= $tag;
                    $tags[] = $tagName;
                }
            }
            $position = $tag_position + strlen($tag);
        }

        if($result_length < $max_length && $position < strlen($html))
        {
            $output .= substr($html, $position, $max_length - $result_length);
        }
        if($result_length == $max_length && $position < strlen($html))
        {
        	$add_ender = true;
        }

        if($cut_to_word)
        {
            $next_char = substr($html, $position+1,1);
            
            if(!preg_match('/\s/', $next_char))
            {
                $space_ended = false;
            }

            if(!$space_ended)
            {
                if(!empty($tags))
                {
                    $space_pos = strrpos($output,' ');
                    if($space_pos > 0)
                    {
                        $output = substr($output,0,$space_pos);
                    }
                }
                else
                {
                    $space_pos = strrpos($output,'<');
                    $space_pos = strrpos($output,' ',$space_pos);
                    if($space_pos > 0)
                    {
                        $output = substr($output,0,$space_pos);
                    }
                }
            }
        }

        if($ender and $add_ender)
        {
            $output = $output.(string)$ender;
        }
        while(!empty($tags))
        {
            $output .= '</'.array_pop($tags).'>';
        }
        return $output;
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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