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

12
E
На сайте с 21.09.2009
Offline
283
#11

Ayavryk, это типа парсера? Или как?

LEOnidUKG
На сайте с 25.11.2006
Offline
1730
#12

ну тогда ещё вот такой мастадонт:

function printTruncated($maxLength, $html, $isUtf8=true)

{

$printedLength = 0;

$position = 0;

$tags = array();

// For UTF-8, we need to count multibyte sequences as one character.

$re = $isUtf8

? '{</?([a-z]+)[^>]*>|***?[a-zA-Z0-9]+;|[\x80-\xFF][\x80-\xBF]*}'

: '{</?([a-z]+)[^>]*>|***?[a-zA-Z0-9]+;}';

while ($printedLength < $maxLength && preg_match($re, $html, $match, PREG_OFFSET_CAPTURE, $position))

{

list($tag, $tagPosition) = $match[0];

// Print text leading up to the tag.

$str = substr($html, $position, $tagPosition - $position);

if ($printedLength + strlen($str) > $maxLength)

{

print(substr($str, 0, $maxLength - $printedLength));

$printedLength = $maxLength;

break;

}

print($str);

$printedLength += strlen($str);

if ($printedLength >= $maxLength) break;

if ($tag[0] == '&' || ord($tag) >= 0x80)

{

// Pass the entity or UTF-8 multibyte sequence through unchanged.

print($tag);

$printedLength++;

}

else

{

// Handle the tag.

$tagName = $match[1][0];

if ($tag[1] == '/')

{

// This is a closing tag.

$openingTag = array_pop($tags);

assert($openingTag == $tagName); // check that tags are properly nested.

print($tag);

}

else if ($tag[strlen($tag) - 2] == '/')

{

// Self-closing tag.

print($tag);

}

else

{

// Opening tag.

print($tag);

$tags[] = $tagName;

}

}

// Continue after the tag.

$position = $tagPosition + strlen($tag);

}

// Print any remaining text.

if ($printedLength < $maxLength && $position < strlen($html))

print(substr($html, $position, $maxLength - $printedLength));

// Close any open tags.

while (!empty($tags))

printf('</%s>', array_pop($tags));

}

echo printTruncated(305,$text,false);

Но он анкоры к ссылкам режит, в остальном всё ок.

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

Парсер + валидатор + чистилка мусора + украшатель/сжиматель кода в одном флаконе. На входе невалидный мусор, на выходе валидный (x)HTML или XML + несколько десятков разных опций типа сжатия, преобразования символов и регистров, чистки старого word'а и т.п. Мелкие ошибки типа незакрытых тегов отрабатывает нормально. Если нарушена вложенность, тогда может запутаться. Входит в php5 в качестве расширения. Ну и на других платформах тоже есть. Встроен во многие HTML-редакторы

В основном юзают те, кто с XSLT работает и привык к 100% валидности. Но здесь как раз в тему - не нужно париться по поводу незакрытых тегов.

Примеры использования

http://howto.memcrab.com/2012/01/phptidy-html.html

http://com.spweb.ru/archives/61

http://php.net/manual/ru/tidy.examples.basic.php

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/
12

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