Как обрезать строку по длине, не нарушая целостности слов?
Автор Сообщение
all__ Не на форуме
Админ
*******

Сообщений: 874
Зарегистрирован: 01.2010
Сообщение: #1
Как обрезать строку по длине, не нарушая целостности слов?
Есть способы для обрезания размера строки, но при этом строка может оборваться по среди слова.
Код:
<?php
$string = 'Это строка которую нужно урезать';
$string =  substr($string, 0, 21);
echo $string;
// выведет "Это строка которую ну"
?>

Не совсем информативно.
Поэтому, нужно организовать возможность отсечь строку сохраняя целостность слов.
Вот один из вариантов:
Код:
<?php
$string = 'Это строка которую нужно урезать';
$string = implode(array_slice(explode('<br>',wordwrap($string,21,'<br>',false)),0,1));
echo $string;
// выведет "Это строка которую"
?>

Может потребоваться, поставить многоточие в конце строки, если ее порезало, на этот случай код придется немного изменить.
Код:
<?php
$string = 'Это строка которую нужно урезать';
$result = implode(array_slice(explode('<br>',wordwrap($string,21,'<br>',false)),0,1));
echo $result;
if($result!=$string)echo'...';
// выведет "Это строка которую..."
?>





Лучшая благодарность - "Мне нравится", +1 или Like! Вверху страницы.
(Последний раз сообщение было отредактировано 29.01.2010 в 18:03, отредактировал пользователь clk824.)
15.01.2010 14:46
Вебсайт Найти все сообщения Цитировать это сообщение
all__ Не на форуме
Админ
*******

Сообщений: 874
Зарегистрирован: 01.2010
Сообщение: #2
RE: Как обрезать строку по длинне, не нарушая целосности слов UTF-8?
Прежние примеры не правильно работают с UTF-8, но хорошо справляются с CP1251.

Я так и не разобрался как сделать грамотно, поэтому сделал как проще.
Вот пример, обрезания строки UTF-8 по словам:

Код:
<?php
$string = 'Это строка которую нужно урезать';
$result = iconv("utf-8", "windows-1251", $string);
$result = implode(array_slice(explode('<br>',wordwrap($result,21,'<br>',false)),0,1));
$result = iconv("windows-1251","utf-8", $result);
echo $result;
if($result!=$string)echo'...';
// выведет "Это строка которую..."
?>





Лучшая благодарность - "Мне нравится", +1 или Like! Вверху страницы.
(Последний раз сообщение было отредактировано 01.05.2010 в 7:54, отредактировал пользователь all__.)
22.01.2010 20:42
Вебсайт Найти все сообщения Цитировать это сообщение
Гость
Unregistered

 
Сообщение: #3
RE: Как обрезать строку по длине, не нарушая целостности слов?
Код:
<?php
function cutString($string, $maxlen) {
    $len = (mb_strlen($string) > $maxlen)
        ? mb_strripos(mb_substr($string, 0, $maxlen), ' ')
        : $maxlen
    ;
    $cutStr = mb_substr($string, 0, $len);
    return (mb_strlen($string) > $maxlen)
        ? '"' . $cutStr . '..."'
        : '"' . $cutStr . '"'
    ;
}

$maxlen = 21;
$string = 'Это строка которую нужно урезать';
echo cutString($string, $maxlen);
$string = 'Это строка которую';
echo cutString($string, $maxlen);
$string = 'Это строка';
echo cutString($string, $maxlen);

/* Сравните результаты этих 3 разных строк с своим кодом). Алсо это работает быстрее и корректно с UTF-8. Если у вас другая кодировка - её лучше указывать в функциях mb_*
*/
15.07.2011 18:53
Цитировать это сообщение
all__ Не на форуме
Админ
*******

Сообщений: 874
Зарегистрирован: 01.2010
Сообщение: #4
RE: Как обрезать строку по длине, не нарушая целостности слов?
Отличный вариант.





Лучшая благодарность - "Мне нравится", +1 или Like! Вверху страницы.
15.07.2011 19:03
Вебсайт Найти все сообщения Цитировать это сообщение
all__ Не на форуме
Админ
*******

Сообщений: 874
Зарегистрирован: 01.2010
Сообщение: #5
RE: Как обрезать строку по длине, не нарушая целостности слов?
Спасибо за сообщение, добавил скобку.

(13.08.2011 19:04)CRABuk писал(а):  Информация помогла, но пропущена ")", поэтому не работало по началу. Надо бы исправить, например, я не сразу нашел, другие тоже могут не заметить.

Код:
? mb_strripos(mb_substr($string, 0, $maxlen), ' ')





Лучшая благодарность - "Мне нравится", +1 или Like! Вверху страницы.
13.08.2011 22:14
Вебсайт Найти все сообщения Цитировать это сообщение
Гость
Unregistered

 
Сообщение: #6
RE: Как обрезать строку по длине, не нарушая целостности слов?
Народ, давайте не будем изобретать велосипед.. в mb_ функции есть параметр кодировка. Если у хостера нет этой функции пишите в саппорт.

mb_substr($str, 0, 3, 'UTF-8');

все написано в мануале http://ru2.php.net/manual/ru/function.mb-substr.php
15.04.2012 12:33
Цитировать это сообщение
Гость
Unregistered

 
Сообщение: #7
RE: Как обрезать строку по длине, не нарушая целостности слов?
function cutString($string, $maxlen)
{
if(strlen($string) <= $maxlen)
return $string;
return implode(preg_split('/(.{1,'.$maxlen.'})(?:\s|$)|(.{'.$maxlen.'})/uS', $string, 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)).'...';
}
21.09.2012 15:13
Цитировать это сообщение
Гость
Unregistered

 
Сообщение: #8
RE: Как обрезать строку по длине, не нарушая целостности слов?
$string = 'Строка которую обрезаем';
$length = 20 // длина до которой обрезаем

$string = preg_replace('/-[^\s]*$/', '', substr($string, 0, $length));

(05.02.2013 12:19)Гость писал(а):  Точнее:
$string = 'Строка которую обрезаем';
$length = 20 // длина до которой обрезаем

$string = preg_replace('/\s[^\s]*$/', '', substr($string, 0, $length));

(05.02.2013 12:19)Гость писал(а):  $string = 'Строка которую обрезаем';
$length = 20 // длина до которой обрезаем

$string = preg_replace('/-[^\s]*$/', '', substr($string, 0, $length));

(05.02.2013 12:19)Гость писал(а):  Точнее:
$string = 'Строка которую обрезаем';
$length = 20 // длина до которой обрезаем

$string = preg_replace('/\s[^\s]*$/', '', substr($string, 0, $length));

Еще точнее

$string = preg_replace('/\s[^\s]+$/', '', substr($string, 0, $length));
05.02.2013 12:19
Цитировать это сообщение
Гость
Unregistered

 
Сообщение: #9
RE: Как обрезать строку по длине, не нарушая целостности слов?
а как в таком коде реализовать обрезку?)


<?php

$xmlFile = 'xml/testimonials.xml';
$xslFile = 'xml/transform.xml';

$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load($xslFile);
$xsl->importStyleSheet($doc);

$doc->load($xmlFile);
echo $xsl->transformToXML($doc);

?>
25.10.2013 9:09
Цитировать это сообщение
Создать ответ