IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Превью текста... Грамотно "отрезать" кусок... (http://www.imho.ws/showthread.php?t=73959)

Boxa 20.11.2004 03:44

Превью текста... Грамотно "отрезать" кусок...
 
Есть статья, эта статья публикуется в новостях, нужно чтобы статья публиковалась не полностью, а например первые 500 символов. substr() не катит, т.к. текст может модержать теги. Чистить на теги тоже не вариант, они нужны. Даже не знаю че делать. То ли считать каждый открывающи1йся тег, то ли регулярку писать... Может кто сталкивался?

RaZEr 20.11.2004 12:12

1. Теги не нужны. Это миф.
2. Если их всё же оставить, то неизбежно прийдется закрывать

Pahan-Hubbitus в свое время решал похожую задачу. Был вариант с внедрением iframe'ов в страницу. В таком случае все незакрытые теги закроет браузер пользователя.

Boxa 20.11.2004 13:08

1. не тебе решать нужны ли теги при отоброжении или нет =) Это решает заказчик.

А вообще все, как я понял, упирается в регулярку. Может кто подкинуть. а то я пока не очень в них шарю...

RaZEr 20.11.2004 13:17

Цитата:

не тебе решать нужны ли теги при отоброжении или нет =) Это решает заказчик.
Умей убедить в своей правоте. Заказчик может столько нарешать, что в конечном счете тебя и обвинит в том, что получилось полное дерьмо.

По теме: рега простая /\<((\w+)|(\/\w+))[^\>]*\>/ получаешь два массива. Открытые элементы и закрытые. Далее вычитаешь массивы, и получаешь разность - т.е. все незакрытые элементы. Дописываешь в конец текста. Всё.

Hubbitus 20.11.2004 13:37

Цитата:

Boxa:
А вообще все, как я понял, упирается в регулярку. Может кто подкинуть. а то я пока не очень в них шарю...
Дело в том что я действительно решал подобную задачу, как правильно заметил RaZEr, и действительно одним из универсальных решений можно считать фрейм, тогда в нем браузер сам автоматически закрывает все не закрытые теги в нужном порядке.

Но известные неудобства такого подхода всем известны, поэтому конечно лучше это делать регой, но тогда возникает немного другая проблема: в общем случае, даже если все открытые теги в порядке их открытия грамотно закрыть, то может получиться ерунда полная (например это крайне актуально с таблицами), да и потом, если подобная обрезка идет точно по количеству символов, то может получиться что обрезано будет по какому-то тегу, соответственно он появится в тексте, как "лишний" текст. Вобщем чтобы все это сделать абсолютно универсальным, для любого HTML-кода, придется писать анализатор текста, схожий с тем что имеется в браузере....
Из всего этого я сделал вывод что RaZEr отчасти прав, теги там не нужны, тоесть нужны, но отнюдь не все, и совсем не в полном объеме. Просто нужно оставить заведомо "безопасные" и "необходимые" (их набор из задачи конкретной), например <b>, <i>, <h1-6>, <u>, <a> и оставлять только их, вырезая остальные (это легко делается указанием allowable_tags в функции strip_tags). В этом случае, чаще всего вид текста практически не портится в этом маленьком куске, и в месте с тем ничего не развалится в основном документе. И закрыть их не будет никакой проблемы одной единственной регой...

RaZEr 20.11.2004 13:49

Если обрезая попадаем на тег, можно довольно просто это исправить.
1. Отражаем строку
2. Убираем (preg_replace) /^[^\<]*\>/

Ale 20.11.2004 14:15

Не проще убедить заказчика писать резюме к текстам? Это фича вполне обычная, заказчику понятная, работает лучше системы регулярок, я проверял :)

Hubbitus 21.11.2004 01:08

Цитата:

RaZEr:
Если обрезая попадаем на тег, можно довольно просто это исправить.
1. Отражаем строку
2. Убираем (preg_replace) /^[^\<]*\>/
Если попали на тег, при обрезании, то гораздо проще просто удалить начиная с символа "<", а в твоей реге, если открывающий тег отрезали (например <table border="1" style="backgr) так и не встретится закрывающей >, поэтому она не сработает :) . Но дело даже не в этом, если бы только одну эту проблему нужно было решить при таком подходе...

RaZEr 21.11.2004 11:38

В моей реге всё правильно. Нужно просто внимательней прочесть мой пост.

Boxa 22.11.2004 12:12

Спасибо пацаны ;) сделал ! Что б я без вас делал...


Часовой пояс GMT +4, время: 18:41.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.