Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > custom bb code


Автор: Aliance 30.7.2006, 19:48
Сделал на форуме ббкод - [hide], а на главную экспортирую новости. Так как это не стандартный ббкод, то в БД он так и хранится - переделывать его приходится вручную.
Раньше был формат такой:
Цитата

[hide]text[/hide]

И все работало, написал такую регу:
Код

$re = '#\\[hide\\] (.*?) \\[/hide\\]#xmi';
$news_text = preg_replace($re, "\n" . '<a id="text' . $data[$i]['topic_firstpost'] . '" href="javascript:{}" onclick="ShowHide_text(\'lay' . $data[$i]['topic_firstpost'] . '\', \'text' . $data[$i]['topic_firstpost'] . '\')"><b>Показать</b></a>' . "\n" . '<div id=\'lay' . $data[$i]['topic_firstpost'] . '\' style=\'display: none; margin-top: 17px; text-align: left\'>\\1</div>' . "\n", $row2->post);
// в $row2->post хранится текст из БД.


Но теперь модифицировал формат немного, он стал таким:
Цитата

[hide=text1|text2]text0[/hide]

Как мне изменить мою регу, чтобы в карманы попало либо целиком все вхождение «text1|text2», либо (что предпочтительнее) каждое по отдельности. 

Автор: Mal Hack 30.7.2006, 21:24
Я вообще не понимаю, как у тебя первая рега работала. Она в принципе  синтаксически не верная.
Код

#\[hide=(.+?)\](.+?)\[/hide\]#is
 

Автор: Aliance 30.7.2006, 23:51
Ну с регами я канечно не дружу, поэтому может понял что не так, но:
на сколько мне известно в языке регулярных выражений спец. символы нужно предотвращать обратными слешами.
А так же в php обратные слешы в том числе нужно обрамлять ими же. Отсюда и получаются зубочистки, я не прав?

Далее, а вот такая рега выдаст мне в два кармана часть в текста в открывающем теге:
Код

$re = '#\[hide=(.*?) \| (.*?)\] (.*?) \[/hide\]#xmi';


ЗЫ: текст многострочный, поэтому модификатор s не подойдет.  

Автор: Mal Hack 30.7.2006, 23:57
Цитата(Aliance @  31.7.2006,  00:51 Найти цитируемый пост)
Отсюда и получаются зубочистки, я не прав?

Нуда так. [ - спецсимвол, мы его экранируем. Одним \. Почему у тебя там их два я до сих пор не понимаю.

Цитата(Aliance @  31.7.2006,  00:51 Найти цитируемый пост)
ЗЫ: текст многострочный, поэтому модификатор s не подойдет.  

Раз он МНОГОСТРОЧНЫЙ, то s еще как подойдет. Без него ничего не будет.

Цитата(Aliance @  31.7.2006,  00:51 Найти цитируемый пост)
Далее, а вот такая рега выдаст мне в два кармана часть в текста в открывающем теге:

А откуда там пробелы??
Код
$re = '#\[hide=([a-z0-9+])\|([a-z0-9]+)\] (.*?) \[/hide\]#si';

В $matches у тебя будет:
0 - понятно все.
1 - text1
2 - text2
3 - внутри тэга 

Автор: Aliance 31.7.2006, 00:34
Цитата(Mal Hack @  31.7.2006,  00:57 Найти цитируемый пост)
Нуда так. [ - спецсимвол, мы его экранируем. Одним \. Почему у тебя там их два я до сих пор не понимаю.

Ты слышал о так называемом "синдроме зубочистки"? Он характере для языков, где рег. выр. представленны ввиде обычкновенных строк. Если мы напишем
Код

echo htmlspecialchars($regexp);

то увидим выражение глазами PCRE. Ведь строка echo "\\" выведет нам один слеш, правильно?

Цитата(Mal Hack @  31.7.2006,  00:57 Найти цитируемый пост)
Раз он МНОГОСТРОЧНЫЙ, то s еще как подойдет. Без него ничего не будет.

Модификатор s - однострочный поиск, m - многострочный. Так почему же мне нужен s?

Цитата(Mal Hack @  31.7.2006,  00:57 Найти цитируемый пост)
А откуда там пробелы??

Я поставил модификатор x, игнорирующий комментарии м пробелы, для удобочитаемости кода.

За код спасибо, тестирую.

Добавлено @ 00:39 
Вот код, работает как нужно:
Код

$re = '#\[hide = (.*?) \| (.*?) \] (.*?) \[/hide\]#xmi';
$str = '[hide=показать|скрыть]text[/hide]';
$pockets = array();

preg_match($re, $str, $pockets);

echo "<pre>"; print_r($pockets); echo "</pre>";
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)