Forum Webscript.Ru
Программирование => PHP => Тема начата: amixen от 03 Мая 2004, 20:49:12
-
Есть гостевуха ну или другие записи в базе.
Берём строчку.
А в ней присутсвует всёкая гадость типа: "\\r\\n"...
Но кроме того там есть еще и всякие теги, типа: ,
,
Ясно, что nl2br() тут не прокатит, надо парсить. А именно, нужно все "\\r\\n" - заменить на
. Но тут загвоздочка!
После разных тегов, типа:
, Этого делать нельзя, так-как корябится html-код...
Пробовал выражения, типа:
$message = ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\\\0
\', $message);
Не получается, хоть стреляй
Вот такая ботва!
Пробовал выражения, типа:
$message = str_replace("\\r",\'\',$message);
$message = ereg_replace("([^>])([\\n])", \'\\\\0
\', $message);
Нето!
Перепробовал всё, правда я не силён в регул. выражениях.
Может кто подскажет, как корректно это сделать...
P.S. Уже всё получилось, см. в конце поста... :)
-
А ты не смешивай плайн-текст с HTML!
И вообще, разметку в базе данных хранить не надо.
Если нужны какие-то простые элементы форматирования, используй bbcode.
-
FreeSpace
- как пройти на базар?
- а ты не ходи на базар, ты заходи к нам в супермаркет! а если нужно что-то по быстренькому, можно воспользоваться онлайн-магазином.
-
[off]Yukko
Знаешь, порой мне тоже хочется вот так вот прокомментировать высказывания других участников форума. И иногда я так и поступаю.
Вот только делаю я это внутри тега [ off ], при этом стараясь по возможности аргументировать свою точку зрения.[/off]
Быть может, ты не согласен, что контент нужно отделять от визуального представления?
-
FreeSpace:
разметку в базе данных хранить не надо.
Спасибо за совет, позволь мне решать как хранить данные в базе. Мне просто не понятно почнму некоректно работает мой код:
$message = ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);
Я хотел что бы все \\r\\n конвертились в
... Все, коме тех, кот. идут после тегов. Просто укажите в чём ошибка или напишите урл, где можно почитать.
___________
Спасибо
-
Господа просьба вместо флейма горсть ответов...
Насчет отделения визуала от данных, я тоже согласен, но у меня ситуация не позволяет перелопатить весь код в несколько мегобайт :(...
-
FreeSpace
Мне кажется и так понятно, что я имел в виду. Если у человека дано много данных, то ему надо с ними делать что-то сейчас, а не перепроектировать все заново. Тем более, что если перепроектировать все заново и еще попытаться оставить все данные нетронутыми, то возникнет еще больше проблем по переформатированию существующих данных.
Само по себе предложение заменить HTML форматирование на bbcode звучит на мой взгляд достаточно абсурдно ибо как для достижения той же функциональности при помощи bbcode, что и в HTML, прийдется просто писать свой язык разметки, который при выводе в браузер снова переводить в html.
Теперь по существу:
amixen:
ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r]ont>, \'
\', $message
тут туева хуча ошибок.
Первая — не закрывается вторая открывающаяся скобка.
Вторая — никакой разницы между [\\r\\n] и [\\r\\n]|[\\n]|[\\r] нет!
объяснение тут:
http://detail.phpclub.net/article/regexp_1
Третья — между закрывающимся тегом > и концом строки могут идти пробелы, поэтому я бы вместо ([\\r\\n]|[\\n]|[\\r]ont написал что-то типа такого:
\\s+
Четвертая — что такое ont?
-
Yukko
Спасибо большое, я дейяствительно малость ошибся при повторном цитировании... мда... код должен был выглядеть так:
$message = ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);
Кстати, какаято глюга в этих bbлщдах... Если вот эту строчку вставить с помощью кнопки - php, но то строка неправильно отображается на экране... хотя в базе лежит нормально!:p
$message = ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);
-
Yukko:
никакой разницы между [\\r\\n] и [\\r\\n]|[\\n]|[\\r] нет
Я не оспариваю, просто спрошу. Почему тогда есть разница, если использовать такие два варианта?
amixen:
$message = ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);
$message = str_replace("\\r",\'\',$message);
$message = ereg_replace("([^>])([\\n])", \'\\\\0
\', $message);
Причем, при втором варианте, ставится
даже после тегов!!! Это из-за пробелов? Но откуда они беруться, если я меняю \\r на пустой символ?
-
Ясно, что nl2br() тут не прокатит, надо парсить.
А именно, нужно все "\\r\\n" - заменить на
. Но тут загвоздочка!
Именно поэтому приложения сначала планируются, а потом пишутся.
Ты просто выбрал неправильное решение. В итоге ты перейдешь
на bbcode, вне зависимости от того, как скоро это произойдет.
Кстати преобразовать HTML -> BBcode совсем несложно.
Как вариант для автоматического создания перевода строки в HTML,
предлагаю поместить
только в случаях двойного перевода
строки в тексте. Остальные - игнорировать.
Чтобы не мучиться с вариантами из \\r\\n, можно при вводе данных
все эти символы заменить на какой-то свой символ, например \\x01,
и работать уже с ним. Или же поступить со всеми входящими
данными ещё проще:
$str = str_replace("\\t", \'\', $str);
$str = preg_replace("/(\\r\\n|\\r)/", "\\n", $str);
Далее, любая последователь из двух \\n создает перевод строки в HTML:
$str = str_replace("\\n\\n", \'
\', $str);
Вывод на редактирование:
$str = str_replace("\\n\\n", "\\r\\n\\r\\n", $str);
Одно замечание: в HTML-коде в таком случае можно делать только один перевод строки:
А это уже глюки:
-
CLiI{er
и ты в эту же степь... моя мама!!! ну какая разница между [ b ] и ну объясните мне идиоту! А теперь объясните мне пожалуйста как вы при помощи bbcode сделаете таблицу? Будете тоже делать теги | ?
CLiI{er:
Или же поступить со всеми входящими
данными ещё проще:
О чем ты??? у него УЖЕ ВСЕ ЛЕЖИТ В БАЗЕ!!!
Я предлагаю тебе пойти и покурить ман в независимости от того по чем он по РНР или по регам...
В итоге ты перейдешь
Никуда я не перейду, ибо не пофиг что хранить в базе квадратные скобочки или угловатые! А умеешь работать с угловатыми, научишься и с квадратными, круглыми, фигурными, волнистыми и т.д.
$string = "mojemkldf
sdlmkfsdf
sadfsada
sldfnsjdfn
";
echo htmlspecialchars($string)."
";
echo htmlspecialchars(preg_replace("/([^>\\\\s])(\\\\r\\\\n)/", "
", $string));
Такой вариант устраивает? работает?
-
[OFF]
Yukko и ты в эту же степь...
Все там будем.
Ты же знаешь как создать таблицу с помощью BBcode, и разницы между тегами в приведенном тобой примере нет. Зачем спрашиваешь?
FreeSpace сказал об этой теме всё.
[/OFF]
-
Yukko:
А теперь объясните мне пожалуйста как вы при помощи bbcode сделаете таблицу?
Я по-моему написал ещё в первом сообщении:
Если нужны какие-то простые элементы форматирования, используй bbcode.
Если эти элементы не нужны (идеальный вариант, например хранить заголовок новости отдельно от самого текста новости), то и использовать их не надо.
Таблицы ббкодом делать не нужно - он предназначен для элементарного форматирования.
Если нужны таблицы - никуда не денешься, используй html. Если же доступ обновлению контента имеет только администратор (в условии об этом ничего не сказано), то ббкод действительно не нужен - можно писать себе любые теги и радоваться. И уж если решили хранить разметку в базе данных, то позаботтесь и о переводе строк в виде тегов
. А разные перекапывания базы регекспами - это ещё большее извращение, чем использование ббкода.
Не предусмотрел этого с самого начала - очень жаль, ничем не могу помочь. Разве что могу посоветовать, как сделать в следующий раз, чтобы не наступать на те же грабли.
Чего человек вообще хочет? Искуственный интеллект, который за него будет определять, где нужно вставить
в куче текста вперемешку с html-разметкой? Ну-ну...
Между прочим, решения типа "два перевода строки =
" так же предполагают модификацию существующих данных, так что не надо рассказывать мне про мегабайты...
-
Спасибо всем за совет, особенно за помощь Yukko. Он и ответил на мой вопрос! Ещераз спасибо огромное всем!!!
-
CLiI{er
Пожалуйста... используй свой ббкод сколь тебе влезет, свои аргументы по поводу работы с круглыми, квадратными и иными видами скобочек я высказал.
Могу добавить, что для работы с угловатыми видами пресловутых "скобочек" (html теги) в РНР существует много, нет не поверишь, ОЧЕНЬ много всяких удобных функций! А для работы с ббкодом ты будешь сидеть и лабать на коленке очередную библиотеку! потому что в существующих либо очень много/мало функциональности, либо они плохо на твой взгляд написаны, либо ты вообще не понимаешь, как они написаны.
Потом возникают проблемы обработки вложенностей, условий:
http://phpclub.ru/talk/showthread.php?s=&threadid=47478 (хотя тред и не связан напрямую с ббкодом, но достаточно показательный, люди сделали простейший шаблонизатор, а потом начали расширять функциональность, в конце концов тот счастливец, кто реализует расширение функционала, получает работу в конторе)
FreeSpace хоть какие-то аргументы приводит, которые читать интересно, а ты безоговорочно говоришь человеку, что он перейдет на ббкод.
FreeSpace:
А разные перекапывания базы регекспами
ага, а Yukko по-твоему модератор раздела для извращенцев, в котором половина вопросов по парсингу и преобразованию html ;)
FreeSpace:
Чего человек вообще хочет? Искуственный интеллект
Мне кажется, решение простое и на искусственный интеллект не тянет.
-
Кстати, я вот еще так реализовал:
$message = str_replace("\\r",\'\',$message);
$message = str_replace("\\t",\'\',$message);
$message = str_replace(">\\n",\'>\',$message);
$message = str_replace("> \\n",\'>\',$message);
$message = str_replace(">\\n\\n",\'>\',$message);
$message = str_replace("\\n",\'
\',$message);
Граблясто конечно :( , но это вобще именно то, что надо, и двойные "\\n" присутствуют при выводе и корректно...