Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: работа с текстом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Вездеход
Отправлено: 06 Мая, 2009 - 09:01:44
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




нужна идея как осуществить... или готовые функции мож есть у кого....


вопщем суть вот в чем. пишу новостной сайт, на страницу выводятся новости, но хочу сделать ограничение на вывод текста новости до определенного значения.
скажем есть новость размером в 2000 символов, мне нужно только 1000 вывести.
т.е. мне нужно порезать новость до нужной длинны.

проблема вот в чем. в новости могут быть ББ-коды и\или теги. они не должны быть "разорваны", т.е. если в нужный размер текста попадает только начала тега (например [b ]) а закрывающий тег Не попадает - нужно сделать так, чтобы он попал.
тоже самое касается начала и конца строк - не хочу чтобы обрезались предложения...


как вариант хочу сделать обязательный параметр при вбивании новости - какая либо метка (например {{{HR}}} ), найдя которую скрипт выведет новость только до метки, а останое срежет. но если к примеру ее забудут поставить то будет сложне...

вопщем кто что знает - подскажите плииз.


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
EuGen Администратор
Отправлено: 06 Мая, 2009 - 10:29:56
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Вот это уже речь о синтаксическом анализе текста.
Ведь представьте себе, что будет, если я напишу новость:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. [открывающий тег]текст ... (тут 2000 символов) ... новости [/закрывающий тег]
  3.  

?
Ведь в таком случае вообще не получится сделать то, что Вы хотите.
Посоветовать можно общее - взять за пример общеизвестный анализатор скобочных выражений (он проверяет правильность скобочного выражения), только скобки будут - теги. Ну и брать первые 1000 символов, потом проверять, верно ли скобочное выражение. Если нет - искать следующий после 1000 символов тег, снова проверять, и так пока выражение не станет верным (тогда это и есть точка отреза), или не встретится конец новости.
Ну, а перенос строк тут не трудное дело добавить - искать или перенос или следующий тег на каждом шаге алгоритма. Только вот еще что - новость может быть изначально с ошибкой в тегах, ну или тот пример, который я привел.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Вездеход
Отправлено: 06 Мая, 2009 - 10:43:36
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




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

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


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
EuGen Администратор
Отправлено: 06 Мая, 2009 - 10:47:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Нет, разбивка по предложениям не предполагалась. Предполагался анализ тегов прямо в самом тексте. То есть ничего разбивать не надо (в строке то куда удобнее искать, чем в массиве).
Если у Вас стоит задача еще и исправления тегов - все гораздо сложнее. Тут нельзя добиться 100% верного результата - можно придумать кучу примеров, когда теги можно выставить "и так и эдак" и оно будет верно с точки зрения синтакиса но криво с точки зрения отображения.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Гость
Отправлено: 06 Мая, 2009 - 17:14:02
Post Id


УДАЛЁН










Вездеход Да тут похоже дело на сложный синтаксический анализатор
А насчет тего всегда можно поступить так - BBкоды это всетаки не HTML и их количетсво очень ограничено (Обычно их штук 10 тегов) и надо организовать чтото типа стека - открывается тег засовываем в стек - а закрывается выпихиваем из стека - если оказалась незавершенным тег типа b i u то просто вручную закрываем его а если ссылка то саму href сохраняем а текст тоже можно обрезать и тд
 
 Top
EuGen Администратор
Отправлено: 06 Мая, 2009 - 18:21:55
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Так не годится. Стек (как "классика" - скобочные выражения) для проверки самое то, но можно так "исправить", что будет еще более криво.
Пример:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. [b]Текст текст [i] текст[/b] и дальше текст [u] текст текст [/b] текст
  3.  

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
CodeWarrior
Отправлено: 07 Мая, 2009 - 10:35:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Янв. 2009  
Откуда: Албания


Помог: 0 раз(а)




Тяжелый случай. Все усложняется тем что тэги могут быть вложенные:
CODE (text):
скопировать код в буфер обмена
  1. [tag]text [tag2]text2[/tag2] text[/tag]

Наверное стоит для добавления новости сделать два поля: краткая новость и полная новость. А если пользователь превысил лимит символов, то сообщить ему об этом при добавлении новости и попросить сократить краткое содержание.
 
 Top
EuGen Администратор
Отправлено: 07 Мая, 2009 - 10:47:03
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




А причем тут вложенные теги то.. Для них как раз стек придуман.. Вопрос в том, что делать, если исправлять надо - мне кажется, эта задача однозначно не разрешима.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Вездеход
Отправлено: 07 Мая, 2009 - 16:11:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




эх... ладно. буду думать так делать так:
или добавлю новое поле
или сделаю метку-разделитель, который нвдо кидать в "середине" новости - чтобы ее резать там.


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
Viper
Отправлено: 08 Мая, 2009 - 08:26:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Вездеход пишет:
или добавлю новое поле
или сделаю метку-разделитель, который нвдо кидать в "середине" новости - чтобы ее резать там.


примерно так же сделано в CMS joomla.
есть 2 поля. 1-ое это краткое содержание и 2-ое это полная статья

к тому же можно к примеру как уже говорилось выше использовать какую-то метку(к примеру {break}) и по ней резать текст.

Вездеход пишет:
проблема вот в чем. в новости могут быть ББ-коды и\или теги. они не должны быть "разорваны", т.е. если в нужный размер текста попадает только начала тега (например [b ]) а закрывающий тег Не попадает - нужно сделать так, чтобы он попал.
тоже самое касается начала и конца строк - не хочу чтобы обрезались предложения...


а вот это уже можно сделать ограничив кол-во символов в поле ввода и проверяя их кол-во яваскриптом. тогда отпадет проблема контроля закрытия/незакрытия тегов.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Stierus Супермодератор
Отправлено: 08 Мая, 2009 - 09:19:51
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
вопщем суть вот в чем. пишу новостной сайт, на страницу выводятся новости, но хочу сделать ограничение на вывод текста новости до определенного значения.
скажем есть новость размером в 2000 символов, мне нужно только 1000 вывести.
т.е. мне нужно порезать новость до нужной длинны.


Писал я новости для сайта, для анонсов тоже надо было выводить обрезанный текст- дня 2 вертел разные варианты анализа тегов, пока не понял, что в анонсе теги, в принципе, не нужны Улыбка. Заголовки выделяются своим оформлением, а внутри просто текст. Задача свелась к вырезанию тегов и отслеживанию завершенности слова (что бы слова не обрезались). Вариант с окончанием предложения тоже изначально рассматривался, но со временем пришло понимание, что новостные предложения бывают очень длинными, что сильно портит внешний вид новостных анонсов - стали резать предложения, но не резать слова. Может, вам тоже получше продумать логику? - и проблем меньше будет и выглядеть будет лучше ....
 
My status
 Top
CodeWarrior
Отправлено: 08 Мая, 2009 - 15:50:26
Post Id



Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Янв. 2009  
Откуда: Албания


Помог: 0 раз(а)




Viper пишет:
а вот это уже можно сделать ограничив кол-во символов в поле ввода и проверяя их кол-во яваскриптом

Можно поправить вручную и поле ввода и яваскрипт... проверять нужно длину средствами PHP
 
 Top
valenok Модератор
Отправлено: 08 Мая, 2009 - 18:11:45
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




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


-----
Truly yours, Sasha.
 
My status
 Top
Champion Супермодератор
Отправлено: 08 Мая, 2009 - 19:21:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Stierus пишет:
отслеживанию завершенности слова (что бы слова не обрезались)
А я-то думаю, зачем отслеживать завершенность слова. Важное поянение! Улыбка
 
 Top
Гость
Отправлено: 08 Мая, 2009 - 20:46:15
Post Id


УДАЛЁН










Champion Ну да а то знаете на некоторых новостных лентах неприятно когда новость обрезается троеточнием в самой середине слова (А лучше всетаки обрещать по предоложению - а в идеале по нужной части предложения)
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB