замена ББ-кода регулярным выражением

Sky_Flex

Новичок
убрать символ входящий в определенные теги

у меня регулярками заменяются ББ-коды.
например вот:
PHP:
$text = ereg_replace("\n", "<br>", $text);
$text = preg_replace("/\[table\](.*?)\[\/table\]/si", '<table class="table">\\1</table>', $text);
т.е. заменяем все \n в тексте на <br>...
но вот как сделать чтобы \n заменялось на <br> везде кроме как внутри тегов
???

возникла необходимость потому, что когда ББ-кодами конструируют таблицу - пишут для понятности не в одну строку (т.е. без \n) а с переносами, типо:
PHP:
   [table]
      [tr]
         [td]
            текст
         [/td]
      [/tr]
   [/table]
что в итоге приводит к следжующему(после прохождения всех регулярок):
PHP:
<br>   <table>
<br>      <tr>
<br>         <td>
<br>            текст
<br>         </td>
<br>       </tr>
<br>    </table>
а это ведет к "поплытию" дизайна... :(
 

Sky_Flex

Новичок
cDLEONтак и делаю. заменяю в самом конце преобразований.
но это не влияет - \n никиду не деняться. потому и надо его или вырезать между нужными тегами, либо не заменять на <br> между ними.

Vin-Diesel
всмысле?
в админке, когда админы формируют тексты - они пользуются не хтмл а ББ-тегами.
 

cDLEON

Онанист РНРСlub
Sky_Flex
Вы включить мозги не пробывали ? Разве нельзя ненужные \n удалить при преобразовании
?
 

WP

^_^
Sky_Flex
Плохая та реализация где надо делать ненужную работу (заменять туда-обратно), покури мою
 

ZigFreeD

Новичок
А что nl2br не помогает?

-~{}~ 15.07.07 10:38:

Кстати посмотри вот это или вот это что впрочем одно и тоже... может это будет всеже лучшем решением
 

Sky_Flex

Новичок
cDLEON, хм... а ты пробовал читать что я спрашиваю?
именно потому и спрашиваю помощи по тому как их внутри убрать, т.к. у меня нет пока мылей как это сделать.
 

Sky_Flex

Новичок
и все равно в тегах
будут <br>. а мне они там не нужны.
мне надо убрать ВСЕ <br> | \n в определенных тегах. например
 

ZigFreeD

Новичок
Автор оригинала: Sky_Flex
и все равно в тегах
будут <br>. а мне они там не нужны.
мне надо убрать ВСЕ <br> | \n в определенных тегах. например

Слушай я тебе дал две ссылки! Чем тебе не нравится готовый скрипт? Работает на ура! Зачем заново изобретать велосипед когда он уже изобретен профессионалами?
Регулярка подошла бы нормально когда тебе тупо нужно заменить bb-коды... но в данном случае тебе нужна и последующая обработка... вот и юзай готовый код... tashkentchi сделал очень хороший скрипт...
 

Sky_Flex

Новичок
а не просил дать мне готовое решение.
я просил помочь с моим вопросом.
просто стао очень интересно для себя.
 

Sky_Flex

Новичок
boombick
ну а ты как думаеш откуда? потомучто они там есть.
сам то понимаешь что тговориш? раз не понимаеш попробуй на примере.
вот текст:

[a=url]url[/a]
\n

\n \n \n
\n
\n текст
\n еще текст


и что ты считаеш что при замене регуляркой
PHP:
$text = preg_replace("/\[table\](.*?)\[\/table\]/si", '<table class="table">\\1</table>', $text);
символ переноса строки "\n" пропадет? это вот интересно почему?! вообщето в правиле написанно "(.*?)" - любой символ 0 или много раз может быть а может и не быть.
вот получиться что после это регулярки имеем:

[a=url]url[/a]
\n <table class="table">
\n [tr]
\n [td][/td]
\n [/tr]
\n </table>
\n текст
\n еще текст


т.е. если теперь "В САМОМ КОНЦЕ" как тьы сказал пропустить через регулярку с заменой \n на <BR> то мы получим ту проблему которую описал я вначале.


ТАК ВСЕ ТАКИ,... как же вырезать все символы переноса строки межды определенными тегами регулярным выражением?!
 

Zetruger

ivan.chistyakov.name
просто удаляй все между

(\[table\])(.*)(\[tr\])

[tr](.*)[td]
[/td](.*)[td]
[/td](.*)[/tr]
[/tr](.*)[tr]
[/tr](.*)[/table]

только не удаляй между [td][/td] =)
 

DeadLy

Новичок
Sky_Flex
зачем \n вставлять, если можно использовать nl2br ?, не понимаю.
 

cDLEON

Онанист РНРСlub
Я вообще не понимаю как ты парсишь ББкод для table свой.
А что если [TD]blablabla[/TD] будет вне
?
Дизайн поплывёт?
Покури функцию preg_replace_callback
 

Sky_Flex

Новичок
сделал немного подругому, собственно вот:
PHP:
$text = preg_replace_callback("/\[table\](.*?)\[\/table\]/si", 'n2br', $text);

	function n2br($text) {
		$text = ereg_replace("\n", "", $text[0]);
		return $text;
	}
т.е. если надо убрать \n между тегами
- то просто добавляю еще одну регулярку_каобак в вызовом функции вырезания \n.
доваольно проктичное решение мне кажется, т.к. сразу потребовалось и из тегов [ul][/ul] убрать \n, и вот:
PHP:
$text = preg_replace_callback("/\[ul\](.*?)\[\/ul\]/si", 'n2br', $text);
P.S.: спасибо что побсказал насчет калбэка, но я с ним написал даже не видя твой пост :) как то сам допер. и на счет совета спасибо, но это во всех ББ редакторах и самом хтмл, если тд вне табл - то диз плывет. короче это на ответственности человека забивающего ББ код будет :)
как и на версталщике напрмер.

P.S.S.: Zetruger - твое решение неподойдет, так как все таким образом не вырежеш - или вырешеш нужный код. т.е. вырезая между [/td] - [/tr] можно вырезать [td] - [/td], хотя... если дописывать ^[td] то... но все равно - ЭТОЖ СКОЛЬКО ЕЩЕ РЕГУЛЯРОК ТО НАДО?!
 
Сверху