Forum Webscript.Ru
Программирование => PHP => Тема начата: fog от 21 Октября 2002, 19:14:41
-
Задача:
Если новость сильно длинная, ограничить её длинну, и сделать ссылку на полную.
1. нехочется делать выборку полных текстов из базы, а потом резать. Можно ли сразу доставать из MySQL первые 1000 символов поля? Имхо нет...
2. Могут быть открытые теги. (т.е. Открыт тег до 1000 а закрыт после, и в итоге получаем главную страничку, с незакрытыми тегами)Как из закрыть? Может есть какая-нибкдь ф-я которая закрывает все открытые теги (не стандартная само собой, кажется стандартных таких нет)
И как вообще подобные штуки откатываются?
-
1. Можно. Читай ман по мускл
2. Не храни теги в базе.
-
fog
обычно в администрированиии новостей для этого просто добавляют отдельное поле "Краткая новость".
ThE0ReTiC
2. Не храни теги в базе.
иногда надо
-
иногда надо
Хм...
Например?
-
Например новости оформляются в визуальном online-редакторе (тот который только под IE работает).
-
Не храни теги в базе.
А если нужно текст как-то выделить? bold`ом например?
-
fog
В мане по мускулу поищи substr - это спасет тебя.
А что касается тэгов - придется, видать тебе самому писать.
Это не такая уж сложная проблема.
Решается примерно так: заводишь ассоциативный массив, ключами которого служат значения различных тегов. Бежишь по тексту. За каждый открытый тег увеличиваешь соответствующий элемент массива, за каждый закрытый - уменьшаешь.
Потом вставляешь в конец закрывающие теги для всех ненулевых элементов.
А если не хочешь геммороиться - составь список закрывающих тегов (ну, там, болд, италик, спан, фонт колор etc.) и вставляй их всем скопом. Я не думаю, что твои новости будут в виде таблиц оформляться (а если будут - подумай еще раз о концепции новостей)
-
В мане по мускулу поищи substr - это спасет тебя.
или left:
`LEFT(str,len)\'
Returns the leftmost `len\' characters from the string `str\':
mysql> select LEFT(\'foobarbar\', 5);
-> \'fooba\'
This function is multi-byte safe.
-
Узнаёшь какие теги открыты, а какие закрыты:
preg_match_all("/<[^<>]+>/", $o_tags); // все открытые
preg_match_all("/<\\/[^<>]+>/", $cl_tags); // все закрытые
Думаю проверку и закрытие оставшихся тегов сделаешь сам ;)
-
подытожим.
fog
наиболее правильным является метод отдельного хранения кратких аннотаций, безо всякого форматирования.
Так у меня сделано на одном сайте.
Там же, в поиске, способом, который предложил Maniac, вынимется из текста кусок - начало, первые 500 символов, с запасом, а потом им делается stripslashes, что очень очень правильно, и полностью снимает воторой вопрос.
На странице с маленькими кусочками новостей вообще не должно быть тегов.
Только функция называется не substr, a substring, или left
Ну, а на другом сайте заказчик не пожелал делать аннотации, а пожелал выводить первое предложение новости. Нет проблем. substring_index до первой точки прекрасно справляется с этой задачей.
Так что, fog, на фоне такого многообразия вариантов, твое заявление о том, что "Имхо, нет", становится несостоятельным.
Я даже больше скажу. открой раз в жизни документацию по mysql и посмотри раздел строковых функций. ты будет потрясен открывшимися перспективами.
-
Читал, читал... скоко много пишут...
Сам вчера делал такую же задачу...
насчет первого, сразу куча вопросов к специалистам... вот вы говорите обрезать на 20 символе (НУ если грубо)
ПРИМЕР:
Думаю проверку и закрытие оставшихся тегов сделаешь сам
РЕЗУЛЬТАТ:
Думаю проверку и зак...
И чего там человек хотел сказать не понятно...
Короче, мне не понравилось что слова обрубаются на полуслове, и поэтому пришлось возиться с тремя различными функциями, код дома остался кому интересно напише, но теперь у меня обрубается только целыми слова код весит 3 строки (маленьких)
А насчет тегов... мне кажется что надо переработать или вид новостей или заключить в табличный вид... как известно таблица сама обрубит ;)
так что с этим я не мучался...
-
Всем спасибо. Я нашел своеобразное решение. Буду воплощать его в жизнь ;-)