Как выбрать из текста первые 300 символов не задев теги

12
kvins
На сайте с 23.08.2011
Offline
95
2131

Нужно вывести из поля в базе данных текст в 400 символов , думаю если использовать substr и в конце символов он попадет к примеру на ссылку то он ее обрежет , вот как правильно вывести чтобы если что он остановил свой вывод текста в пределах нужного мне количества , но не задевая html теги.

Вот в gms обычно ставится какой то атрибут и он вывод до него , В принципе можно и так хотя я не знаю как это сделано , но хотелось бы чтобы автоматически было

Магазин уникальных статей. (http://linkum.ru/to/13254/)
[Удален]
#1

regexp. реж теги, воруй, убивай, грабь караваны

IL
На сайте с 20.04.2007
Offline
435
#2

Я бы сначала вырезал все тэги (strip_tags), а потом уже брал первые символы.

Чтоб на полуслове не обрезать - найти позицию (strpos), к примеру, пробела после 400 символа.

p.s. Если тэги нужны - чуть сложнее..

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
LEOnidUKG
На сайте с 25.11.2006
Offline
1728
#3

Пример текста в HTML будет или гадать на кофейной гуще?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Ayavryk
На сайте с 11.10.2003
Offline
209
#4

0. Отвалидизировать с помощью tidy HTML вычистив лишнее.

1. Разбить на слова по тегам (начало тега '<')

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

3. склеять с подсчетом длины результата и без учета тегов.

4. пропустить через tidy c валидацией чтобы закрыл порушенные теги

Ну а вообще прежде чем делать присмотрелся бы к задаче. Вполне возможно что нашел бы более приемлемое решение не программно, а организационно.

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/
Segey
На сайте с 23.08.2005
Offline
404
#5

Я б разбил по словам (просто explode через пробел), взял столько сколько нужно, чтобы уложиться в длинну, если что то еще вылезит так и справить а и правда не устраивать гадания

Brexit - уже совсем рядом. (https://about-this-model.blogspot.com/2019/03/brexit.html)
kvins
На сайте с 23.08.2011
Offline
95
#6

А что выкладывать. Ну ладно вот текст

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nulla libero, tristique in interdum id, pharetra sit amet ligula. Aliquam elementum hendrerit nisi, at tristique metus pulvinar vel. Nullam in urna id felis interdum facilisis. Aenean non tincidunt purus. Nulla ligula felis, vulputate eu <a href="#">ссылка1</a>
pellentesque at, placerat non neque. Nulla varius justo sit amet nisl rutrum eu vulputate ligula eleifend. Pellentesque nec erat cursus enim mattis tempor volutpat eget ante. Morbi laoreet nibh in quam viverra ut pellentesque nulla sagittis. Duis porttitor nisi non turpis luctus ac semper ligula sodales
<a href="#">ссылка2</a>

К примеру получилось так что количество символов остановилось прям по середине второй ссылки , как ее тоже захватит в текст и остановится после нее

---------- Добавлено 29.07.2012 в 17:16 ----------

Убирать html теги в тексте не вариант

LEOnidUKG
На сайте с 25.11.2006
Offline
1728
#7

ИМХО не реал.

---------- Добавлено 29.07.2012 в 20:41 ----------

А не, всё ок, есть такая вот фигня.

function substr_html($string, $length)

{

$count = 0;

/*

* $state = 0 - normal text

* $state = 1 - in HTML tag

* $state = 2 - in HTML entity

*/

$state = 0;

for ($i = 0; $i < strlen($string); $i++) {

$char = $string[$i];

if ($char == '<') {

$state = 1;

} else if ($char == '&') {

$state = 2;

$count++;

} else if ($char == ';') {

$state = 0;

} else if ($char == '>') {

$state = 0;

} else if ($state === 0) {

$count++;

}

if ($count === $length) {

return substr($string, 0, $i + 1);

}

}

return $string;

}

edogs software
На сайте с 15.12.2005
Offline
775
#8
kvins:
А что выкладывать. Ну ладно вот текст

К примеру получилось так что количество символов остановилось прям по середине второй ссылки , как ее тоже захватит в текст и остановится после нее

---------- Добавлено 29.07.2012 в 17:16 ----------

Убирать html теги в тексте не вариант

Ну чисто для Вашего примера можно использовать что-то вроде этого


function edogsExtractFirstN($text,$n) {
$m=preg_split('~(<.*?>.*?</.*?>)~si',$text,null,PREG_SPLIT_DELIM_CAPTURE);
$current='';
foreach($m as $k=>$v) {
if(strlen($current.$v)>$n) {//current string larger than we need
if($k%2==0) $current=substr($current.$v,0,$n); //we can cut it, since it's not a tag
break;
}
$current.=$v;
}
return $current;
}
$res=edogsExtractFirstN($text,323);
echo $res;

Однако достаточно <p> <a href=""></a></p> или таблиц или списков и уже привет...

По настоящему надо отрезать сколько нужно, а потом все меньше и меньше, каждый раз проверяя на валидность, пока не дойдете до валидного html содержания.

LEOnidUKG:
ИМХО не реал.А не, всё ок, есть такая вот фигня.

Не лучший вариант

echo substr_html('<a href="">text</a>',3);

выводит <a href="">tex

LEOnidUKG:
ну явно там не будет 3-и стоять :)

Там не в числе суть, а в том что если "обрезание" попадет между открывающим и закрывающим тэгом <a> (каковые у ТС в примере есть), то в вырезаном куске останется только открывающий тэг, что не айс.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
LEOnidUKG
На сайте с 25.11.2006
Offline
1728
#9
Не лучший вариант

ну явно там не будет 3-и стоять :)

Ayavryk
На сайте с 11.10.2003
Offline
209
#10
edogs:
если "обрезание" попадет между открывающим и закрывающим тэгом <a> .

Для этого много лет назад в состав php5 был введен tidy. он все что надо закроет и отвалидизирует, до кучи еще и почистит от мусора.

+ дополнительная рег-проверка на то чтобы срезать пустой тег в конце.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий