Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
нужна идея как осуществить... или готовые функции мож есть у кого....
вопщем суть вот в чем. пишу новостной сайт, на страницу выводятся новости, но хочу сделать ограничение на вывод текста новости до определенного значения.
скажем есть новость размером в 2000 символов, мне нужно только 1000 вывести.
т.е. мне нужно порезать новость до нужной длинны.
проблема вот в чем. в новости могут быть ББ-коды и\или теги. они не должны быть "разорваны", т.е. если в нужный размер текста попадает только начала тега (например [b ]) а закрывающий тег Не попадает - нужно сделать так, чтобы он попал.
тоже самое касается начала и конца строк - не хочу чтобы обрезались предложения...
как вариант хочу сделать обязательный параметр при вбивании новости - какая либо метка (например {{{HR}}} ), найдя которую скрипт выведет новость только до метки, а останое срежет. но если к примеру ее забудут поставить то будет сложне...
вопщем кто что знает - подскажите плииз.
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
EuGen
Отправлено: 06 Мая, 2009 - 10:29:56
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Вот это уже речь о синтаксическом анализе текста.
Ведь представьте себе, что будет, если я напишу новость:
?
Ведь в таком случае вообще не получится сделать то, что Вы хотите.
Посоветовать можно общее - взять за пример общеизвестный анализатор скобочных выражений (он проверяет правильность скобочного выражения), только скобки будут - теги. Ну и брать первые 1000 символов, потом проверять, верно ли скобочное выражение. Если нет - искать следующий после 1000 символов тег, снова проверять, и так пока выражение не станет верным (тогда это и есть точка отреза), или не встретится конец новости.
Ну, а перенос строк тут не трудное дело добавить - искать или перенос или следующий тег на каждом шаге алгоритма. Только вот еще что - новость может быть изначально с ошибкой в тегах, ну или тот пример, который я привел.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Вездеход
Отправлено: 06 Мая, 2009 - 10:43:36
Частый посетитель
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
гм
не знаю правельно понял или нет...
но т.е. алгоритм такой можно сделать
- разбиваем текст на массив, взяв в качестве разделителя например ". ". чтобы предложения не разрывались.
- перебираем получившийся массив, постепенно добавляя к итогу по предложению, пока не будет получен нужный размер.
- во время формирования итога отслеживаем в предложениях теги - т.е. если встречаем открытый тег то итог обрезать нельзя пока не будет закрывающего тега.
но тут возникает вопросы.
1. разбивать по предложениям как? брать в качестве конца строки точку - не всегда правильно, ведь в тексте они могут быть и так просто. надо будет думаю проверку делать на последующую букву - т.е. если буква большая - новое предложение идет, и наоборот.
2. а как быть действительно если теги не корректны - т.е. нет например закрывающих...
как исправить это я даже не знаю...
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
EuGen
Отправлено: 06 Мая, 2009 - 10:47:28
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Нет, разбивка по предложениям не предполагалась. Предполагался анализ тегов прямо в самом тексте. То есть ничего разбивать не надо (в строке то куда удобнее искать, чем в массиве).
Если у Вас стоит задача еще и исправления тегов - все гораздо сложнее. Тут нельзя добиться 100% верного результата - можно придумать кучу примеров, когда теги можно выставить "и так и эдак" и оно будет верно с точки зрения синтакиса но криво с точки зрения отображения.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Гость
Отправлено: 06 Мая, 2009 - 17:14:02
УДАЛЁН
Вездеход Да тут похоже дело на сложный синтаксический анализатор
А насчет тего всегда можно поступить так - BBкоды это всетаки не HTML и их количетсво очень ограничено (Обычно их штук 10 тегов) и надо организовать чтото типа стека - открывается тег засовываем в стек - а закрывается выпихиваем из стека - если оказалась незавершенным тег типа b i u то просто вручную закрываем его а если ссылка то саму href сохраняем а текст тоже можно обрезать и тд
EuGen
Отправлено: 06 Мая, 2009 - 18:21:55
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Так не годится. Стек (как "классика" - скобочные выражения) для проверки самое то, но можно так "исправить", что будет еще более криво.
Пример:
[b]Текст текст [i] текст[/b] и дальше текст [u] текст текст [/b] текст
- 2 не закрытых тега и один лишний закрывающий. Какой вариант тут вообще правильный? Непонятно. Это выражение можно сделать правильным кучей способов, но остается только догадываться, какой из них имел ввиду автор новости.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
CodeWarrior
Отправлено: 07 Мая, 2009 - 10:35:17
Частый гость
Покинул форум
Сообщений всего: 157
Дата рег-ции: Янв. 2009 Откуда: Албания
Помог: 0 раз(а)
Тяжелый случай. Все усложняется тем что тэги могут быть вложенные:
Наверное стоит для добавления новости сделать два поля: краткая новость и полная новость. А если пользователь превысил лимит символов, то сообщить ему об этом при добавлении новости и попросить сократить краткое содержание.
EuGen
Отправлено: 07 Мая, 2009 - 10:47:03
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
А причем тут вложенные теги то.. Для них как раз стек придуман.. Вопрос в том, что делать, если исправлять надо - мне кажется, эта задача однозначно не разрешима.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Вездеход
Отправлено: 07 Мая, 2009 - 16:11:23
Частый посетитель
Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008 Откуда: Россия
Помог: 0 раз(а)
эх... ладно. буду думать так делать так:
или добавлю новое поле
или сделаю метку-разделитель, который нвдо кидать в "середине" новости - чтобы ее резать там.
----- о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
Viper
Отправлено: 08 Мая, 2009 - 08:26:17
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
Вездеход пишет:
или добавлю новое поле
или сделаю метку-разделитель, который нвдо кидать в "середине" новости - чтобы ее резать там.
примерно так же сделано в CMS joomla.
есть 2 поля. 1-ое это краткое содержание и 2-ое это полная статья
к тому же можно к примеру как уже говорилось выше использовать какую-то метку(к примеру {break}) и по ней резать текст.
Вездеход пишет:
проблема вот в чем. в новости могут быть ББ-коды и\или теги. они не должны быть "разорваны", т.е. если в нужный размер текста попадает только начала тега (например [b ]) а закрывающий тег Не попадает - нужно сделать так, чтобы он попал.
тоже самое касается начала и конца строк - не хочу чтобы обрезались предложения...
а вот это уже можно сделать ограничив кол-во символов в поле ввода и проверяя их кол-во яваскриптом. тогда отпадет проблема контроля закрытия/незакрытия тегов.
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
вопщем суть вот в чем. пишу новостной сайт, на страницу выводятся новости, но хочу сделать ограничение на вывод текста новости до определенного значения.
скажем есть новость размером в 2000 символов, мне нужно только 1000 вывести.
т.е. мне нужно порезать новость до нужной длинны.
Писал я новости для сайта, для анонсов тоже надо было выводить обрезанный текст- дня 2 вертел разные варианты анализа тегов, пока не понял, что в анонсе теги, в принципе, не нужны . Заголовки выделяются своим оформлением, а внутри просто текст. Задача свелась к вырезанию тегов и отслеживанию завершенности слова (что бы слова не обрезались). Вариант с окончанием предложения тоже изначально рассматривался, но со временем пришло понимание, что новостные предложения бывают очень длинными, что сильно портит внешний вид новостных анонсов - стали резать предложения, но не резать слова. Может, вам тоже получше продумать логику? - и проблем меньше будет и выглядеть будет лучше ....
CodeWarrior
Отправлено: 08 Мая, 2009 - 15:50:26
Частый гость
Покинул форум
Сообщений всего: 157
Дата рег-ции: Янв. 2009 Откуда: Албания
Помог: 0 раз(а)
Viper пишет:
а вот это уже можно сделать ограничив кол-во символов в поле ввода и проверяя их кол-во яваскриптом
Можно поправить вручную и поле ввода и яваскрипт... проверять нужно длину средствами PHP
valenok
Отправлено: 08 Мая, 2009 - 18:11:45
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Речь идет не о том, что тебе слишком длинный текст подсунут. Речь об удобстве пользователям. А длину даже проверять не нужно потому что база данных и сама может обрезать где надо.
----- Truly yours, Sasha.
Champion
Отправлено: 08 Мая, 2009 - 19:21:50
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Stierus пишет:
отслеживанию завершенности слова (что бы слова не обрезались)
А я-то думаю, зачем отслеживать завершенность слова. Важное поянение!
Гость
Отправлено: 08 Мая, 2009 - 20:46:15
УДАЛЁН
Champion Ну да а то знаете на некоторых новостных лентах неприятно когда новость обрезается троеточнием в самой середине слова (А лучше всетаки обрещать по предоложению - а в идеале по нужной части предложения)
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.