Валидная обрезка html

ХакИрФсимагущий

[засикречино]
Валидная обрезка html

Здраствуйте. У меня есть сайт допустим Сайт про: Маникюр и Уход за руками На первой стнанице идет лента с обрезанным контентом. Все бы хорошо да только не красиво както. В данный момент я обрезаю вот таким образом:
PHP:
$ct[content] = strip_tags($ct[content],'<img>');
$ct[content] = substr($ct[content], '0', '511').strtok(substr($ct[content], '511', '1024'),'<,.').' ... ';
И собственоо вопрос каким обрзаом обрезать Html статью чтобы код был валидным и смотрелось все весьма красиво?
 

Splurov

Новичок
- идём посимвольно по тексту, до места обреза
- по пути запоминаем встретившиеся открывающие теги
- если встретился соответствующий закрывающий, значит открывающий запоминать не нужно, не забываем про вложенность
- дошли до места обреза, закрываем не закрытые теги
- радуемся
 

ХакИрФсимагущий

[засикречино]
Спасибо, этот алгоритм я и сам в силах состаивить. Проблема заключается в рализации. Я плолхо представляю через какие функции подобное реализовать. Причем рализовать нужно с максимальной производительностью
 

ХакИрФсимагущий

[засикречино]
Во, вспомнил есть такая всеми забытая функция preg_replace_callback()
PHP:
preg_replace_callback('/<[^>]+(.*)>/is', "CloseTag", $_POST['content']);
теперь осталось функцию CloseTag сделать
сначало при обнуружении открыаюшего тега в переменную буду записывать закрываюший а при обноружении закрываюшего тега удалять закрываюший тег из переменной. в итоге останутся только незакрытые теги в нудном порядке

-~{}~ 02.09.10 21:43:

Автор оригинала: dimagolov
тогда ты забыл огласить бюджет
Я же не за написанием срипта обратился а за помошью в рациональном решениии. Функцию то 10 раз нужно выполнить в данном примере. Да и не стоит меня списывать только потомучто я только учюсь)). Кто знает до какого уровня я уже доучился :D
 

ХакИрФсимагущий

[засикречино]

Splurov

Новичок
я смотрю
PHP:
<?php

$a = 'test test test <a href="" title="some content more than fourteen characters">Test</a>';

//$a = strip_tags($a,'<img>');
$a = substr($a, '0', '20') . strtok(substr($a, '20', '40'),'<,.').' ... ';

echo htmlspecialchars($a);
 

ХакИрФсимагущий

[засикречино]
Ну впринципе правильно смотришь. Но у меня объемы гораздо больше поэтому мне это не грозит. Но для универсальности надо будет учесть это.

-~{}~ 02.09.10 22:17:

Но эта проверка опять лишняя нагрузка думаю надо с конца проверять кадлый символ до достижения < или > и либо стереть тег либо прекратить проверку, так как регулярка это сделает гораздо медленее
 

dimagolov

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

ХакИрФсимагущий

[засикречино]
Автор оригинала: dimagolov
обычно начинают с какого-то решения, и если оно не удовлетворяет требованиям, к примеру производительности, то ищут пути сделать оптимальнее. ибо преждевременная оптимизация это зло.

ты измерял?
Кто говорит, что обычно делают так или эдок, чаще всего заблуждаются. Я уже представил себе скрипт который я сделал бы идя на пролом))) Все гениальное просто, php не должно быть исключением. И об оптимизации заботится надо всегда!! Лутший програмист это тот програмист который напишет более быструю программу быстрее, чем его конкурент.

А на счет измерения скорости то тут и мерять, то нечего. просто нужно знать как регулярка работает а как strtok и ей подобные.
 

ХакИрФсимагущий

[засикречино]
Автор оригинала: Splurov
лучше
Код:
/<([a-z0-9]+)(.*?)(?:>|^)/is
тоже пойдет но не понял значение ^ если это конец строки то $и еше наоброт нужны данные для дополнительной обработки а что в нутри тегов нам не важно поэтому вот так
Код:
'/<([\w\d!-]+)(?:.*?)(>|$)/is'
если конечно сработает)))

-~{}~ 02.09.10 23:56:

Автор оригинала: weregod
у Вас однобокая точка зрения на лучших программистов ;)
Ну я же рассматриваю ситуацию когда единственными важными параметрами является скорость работы скрипта))) А вопрос безопаснсти это к другому виду программирования относится, но даже там скорость работы очень важна :D

-~{}~ 03.09.10 01:44:

Зацените, правдо хотелось бы return $a в конец функции поставить, но увы невыйдет((. Если кто знает как оптимизирывать пишите.
PHP:
function CloseTag($i=false){
static $a;
if($i==false){return $a;}else{
if($i[2]=='!'||$i[3]!='>'){
return false;}
elseif($i[1]=='/'){
$a=substr($a,strlen($i[2])+3);
return $i[0];}
elseif($i[2]=='br'||$i[1]=='img'){
return $i[0];}  else {
$a='</'.$i[2].'>'.$a;
return $i[0];
}}}

$ct[content] = preg_replace_callback('/<(\/?)([\w\d!]+)(?:.*?)(>|$)/is', "CloseTag", substr($ct[content], '0', '511').strtok(substr($ct[content], '511', '1024'),'<,.')).' ... '.CloseTag();
-~{}~ 03.09.10 02:15:

на моем сайте в среднем скорость 10 обработок этого api занаяли менее 0.001сек
 
Сверху