Автор Тема: Регулярные выражения или...  (Прочитано 9826 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн amixen

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://what.com.ua
Регулярные выражения или...
« : 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<BR>\', $message);

Нето!
Перепробовал всё, правда я не силён в регул. выражениях.

Может кто подскажет, как корректно это сделать...

P.S. Уже всё получилось, см. в конце поста... :)
« Последнее редактирование: 06 Мая 2004, 12:31:12 от amixen »
Да прибудет с Вами мысль :)

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Регулярные выражения или...
« Ответ #1 : 03 Мая 2004, 22:56:58 »
А ты не смешивай плайн-текст с HTML!
И вообще, разметку в базе данных хранить не надо.
Если нужны какие-то простые элементы форматирования, используй bbcode.
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Регулярные выражения или...
« Ответ #2 : 04 Мая 2004, 00:24:09 »
FreeSpace
- как пройти на базар?
- а ты не ходи на базар, ты заходи к нам в супермаркет! а если нужно что-то по быстренькому, можно воспользоваться онлайн-магазином.
работа в Украине

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Регулярные выражения или...
« Ответ #3 : 04 Мая 2004, 02:12:28 »
[off]Yukko
Знаешь, порой мне тоже хочется вот так вот прокомментировать высказывания других участников форума. И иногда я так и поступаю.
Вот только делаю я это внутри тега [ off ], при этом стараясь по возможности аргументировать свою точку зрения.[/off]

Быть может, ты не согласен, что контент нужно отделять от визуального представления?
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн amixen

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://what.com.ua
Регулярные выражения или...
« Ответ #4 : 04 Мая 2004, 02:12:56 »
FreeSpace:
Цитировать
разметку в базе данных хранить не надо.

Спасибо за совет, позволь мне решать как хранить данные в базе. Мне просто не понятно почнму некоректно работает мой код:
$message ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);

Я хотел что бы все \\r\\n конвертились в
... Все, коме тех, кот. идут после тегов. Просто укажите в чём ошибка или напишите урл, где можно почитать.
___________
Спасибо
Да прибудет с Вами мысль :)

Оффлайн amixen

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://what.com.ua
Регулярные выражения или...
« Ответ #5 : 04 Мая 2004, 02:15:44 »
Господа просьба вместо флейма горсть ответов...
Насчет отделения визуала от данных, я тоже согласен, но у меня ситуация не позволяет перелопатить весь код в несколько мегобайт :(...
« Последнее редактирование: 04 Мая 2004, 02:28:12 от amixen »
Да прибудет с Вами мысль :)

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Регулярные выражения или...
« Ответ #6 : 04 Мая 2004, 11:16:52 »
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?
работа в Украине

Оффлайн amixen

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://what.com.ua
Регулярные выражения или...
« Ответ #7 : 04 Мая 2004, 13:35:31 »
Yukko
Спасибо большое, я дейяствительно малость ошибся при повторном цитировании... мда... код должен был выглядеть так:
Цитировать
$message = ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);


Кстати, какаято глюга в этих bbлщдах... Если вот эту строчку вставить с помощью кнопки - php, но то строка неправильно отображается на экране... хотя в базе лежит нормально!:p
$message ereg_replace("([^>])([\\r\\n]|[\\n]|[\\r])", \'\\0
\', $message);
Да прибудет с Вами мысль :)

Оффлайн amixen

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://what.com.ua
Регулярные выражения или...
« Ответ #8 : 04 Мая 2004, 13:54:40 »
Цитировать
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 на пустой символ?
Да прибудет с Вами мысль :)

Оффлайн CLiI{er

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 57
  • +0/-0
  • 0
    • Просмотр профиля
    • http://glossword.info/
Регулярные выражения или...
« Ответ #9 : 04 Мая 2004, 14:37:33 »
Цитировать
Ясно, что 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", \'<br/>\', $str);
Вывод на редактирование:
$str str_replace("\\n\\n""\\r\\n\\r\\n"$str);
Одно замечание: в HTML-коде в таком случае можно делать только один перевод строки:


А это уже глюки:


« Последнее редактирование: 04 Мая 2004, 14:43:48 от CLiI{er »
gw веб-песочница жж

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Регулярные выражения или...
« Ответ #10 : 04 Мая 2004, 15:08:07 »
CLiI{er
и ты в эту же степь... моя мама!!! ну какая разница между [ b ] и ну объясните мне идиоту! А теперь объясните мне пожалуйста как вы при помощи bbcode сделаете таблицу? Будете тоже делать теги
?

Цитировать
CLiI{er:
Или же поступить со всеми входящими
данными ещё проще:

О чем ты??? у него УЖЕ ВСЕ ЛЕЖИТ В БАЗЕ!!!
Я предлагаю тебе пойти и покурить ман в независимости от того по чем он по РНР или по регам...
Цитировать
В итоге ты перейдешь

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



 $string 
"mojemkldf
      <font> 
      sdlmkfsdf
      sadfsada
      <b>sldfnsjdfn
      </b>   
      "
;
      echo 
htmlspecialchars($string)."
"
;
      echo 
htmlspecialchars(preg_replace("/([^>\\\\s])(\\\\r\\\\n)/""
"
$string));


Такой вариант устраивает? работает?
« Последнее редактирование: 04 Мая 2004, 15:17:24 от Yukko »
работа в Украине

Оффлайн CLiI{er

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 57
  • +0/-0
  • 0
    • Просмотр профиля
    • http://glossword.info/
Регулярные выражения или...
« Ответ #11 : 04 Мая 2004, 20:00:10 »
[OFF]
Yukko
Цитировать
и ты в эту же степь...

Все там будем.
Ты же знаешь как создать таблицу с помощью BBcode, и разницы между тегами в приведенном тобой примере нет. Зачем спрашиваешь?
FreeSpace сказал об этой теме всё.
[/OFF]
gw веб-песочница жж

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Регулярные выражения или...
« Ответ #12 : 04 Мая 2004, 20:07:01 »
Цитировать
Yukko:
А теперь объясните мне пожалуйста как вы при помощи bbcode сделаете таблицу?

Я по-моему написал ещё в первом сообщении:
Если нужны какие-то простые элементы форматирования, используй bbcode.
Если эти элементы не нужны (идеальный вариант, например хранить заголовок новости отдельно от самого текста новости), то и использовать их не надо.
Таблицы ббкодом делать не нужно - он предназначен для элементарного форматирования.
Если нужны таблицы - никуда не денешься, используй html. Если же доступ обновлению контента имеет только администратор (в условии об этом ничего не сказано), то ббкод действительно не нужен - можно писать себе любые теги и радоваться. И уж если решили хранить разметку в базе данных, то позаботтесь и о переводе строк в виде тегов
. А разные перекапывания базы регекспами - это ещё большее извращение, чем использование ббкода.
Не предусмотрел этого с самого начала - очень жаль, ничем не могу помочь. Разве что могу посоветовать, как сделать в следующий раз, чтобы не наступать на те же грабли.

Чего человек вообще хочет? Искуственный интеллект, который за него будет определять, где нужно вставить
 в куче текста вперемешку с html-разметкой? Ну-ну...
Между прочим, решения типа "два перевода строки =
" так же предполагают модификацию существующих данных, так что не надо рассказывать мне про мегабайты...
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн amixen

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://what.com.ua
Регулярные выражения или...
« Ответ #13 : 05 Мая 2004, 00:14:34 »
Спасибо всем за совет, особенно за помощь Yukko. Он и ответил на мой вопрос! Ещераз спасибо огромное всем!!!
Да прибудет с Вами мысль :)

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Регулярные выражения или...
« Ответ #14 : 05 Мая 2004, 00:35:43 »
CLiI{er
Пожалуйста... используй свой ббкод сколь тебе влезет, свои аргументы по поводу работы с круглыми, квадратными и иными видами скобочек я высказал.

 Могу добавить, что для работы с угловатыми видами пресловутых "скобочек" (html теги) в РНР существует много, нет не поверишь, ОЧЕНЬ много всяких удобных функций! А для работы с ббкодом ты будешь сидеть и лабать на коленке очередную библиотеку! потому что в существующих либо очень много/мало функциональности, либо они плохо на твой взгляд написаны, либо ты вообще не понимаешь, как они написаны.
Потом возникают проблемы обработки вложенностей, условий:
http://phpclub.ru/talk/showthread.php?s=&threadid=47478 (хотя тред и не связан напрямую с ббкодом, но достаточно показательный, люди сделали простейший шаблонизатор, а потом начали расширять функциональность, в конце концов тот счастливец, кто реализует расширение функционала, получает работу в конторе)

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

Цитировать
FreeSpace:
А разные перекапывания базы регекспами

ага, а Yukko по-твоему модератор раздела для извращенцев, в котором половина вопросов по парсингу и преобразованию html ;)

Цитировать
FreeSpace:
Чего человек вообще хочет? Искуственный интеллект

Мне кажется, решение простое и на искусственный интеллект не тянет.
работа в Украине

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28