Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

регулярные выражения

1.9K
13 октября 2004 года
Andius
61 / / 04.01.2004
Здравствуйте, господа(и дамы:D)!

Недавно обнаружил множество ошибок в коде своей гостевой книги. Особенно волнуют регулярные выражения. Я делаю ответ с цитированием - текст выделяется особым образом. В тело сообщения просто вставляется текст:
 
Код:
[q=$author]$post[/q]


где $author - имя автора, которого цитируют, а $post - сама цитата.
Так вот, как сделать с помощью регулярных выражений, чтобы этот текст заменялся следующим:
<div class='quot'>$author
$post</div>

bbcode... или как там.
Надеюсь, что суть понятна!
1.9K
14 октября 2004 года
Andius
61 / / 04.01.2004
Никто не знает? Или просто вопрос не понятен?
4.5K
15 октября 2004 года
NightSleeper
43 / / 09.10.2004
Цитата:
Originally posted by Andius
Никто не знает? Или просто вопрос не понятен?



Не понятно: зачем тут применять рег. выражения? Эта гостевая книга написана тобой? ;) Если да, то ты не стеснён переписать тот фрагмент кода где формируется строка

 
Код:
[q=$author]$post[/q]


переписать так, чтобы вместо неё выводился нужный текст:
<div class='quot'>$author
$post</div> :???:

Маленькое добавление (не суть): я бы выводил строку:
<div $css_class>$author
$post</div>

Что касается применения регулярного выражения, то здесь не так сложно, приведу один из возможных вариантов, если я правильно понял проблему:

поиск с заменой (опробовано в Perl ActiveState)

 
Код:
my $my_string = "како-то текст [q=\$author]\$post[\/q] какой-то текст";

print "Было: ".$my_string."\n";

$my_string =~ s/\[q=(\$author)\](\$post)\[\/q\]/<div class='quot'>$1<\/b>
$2<\/div>/;

print "Стало: ".$my_string."\n";


основная конструкция здесь

 
Код:
s/A/B/;

s/искомое/то чем нужно заменить/;


в искомом (в А) в круглые скобки взято то, что нужно перенести в строку результата, содержимое первых круглых скобок в результате (в Б) пишется $1, содержимое вторых - $2.

Инджой :D
1.9K
15 октября 2004 года
Andius
61 / / 04.01.2004
Не знаю, твой пример почему-то не работает.
Блин, ну эта хрень ведь во всех форумах сделана. Неужели никто не может предоставить готовый работающий код? Гостевуху я пишу сам.
Вот как я сейчас использую рег. выражения:
 
Код:
$post = preg_replace('/(\[q\])(\r\n)*(.*?)(\[\/q\])/', "<div class='quot'>\\3</div>", $post);

Это так называемое цитирование. Но присутствуют глюки: Если цитируешь в одной строке, например
 
Код:
[q]цитата в одной строке[/q]

то все нормально, а если цитируешь что-то больше одной строки, например
 
Код:
[q]
первая строка
вторая строка
[/q]


то нифига не цитируется, т.е. код не обрабатывается...

И еще вопрос:
Я пользуюсь услугами бесплатного хостинга dhost.info. И почему-то в моей гостевухе происходит такой вот глюк:
Если в сообщении присутствуют двойные кавычки " , то сообщение не добавляется.
В то же время у меня на локалке все работает нормально. Это глюк с хостом? Как его можно обойти?
4.5K
15 октября 2004 года
NightSleeper
43 / / 09.10.2004
Цитата:
Originally posted by Andius
Не знаю, твой пример почему-то не работает.



Причина того что мой примерчик не работает - я не учёл что на этом форуме в целях безопасности отбрасываются эскейп-символы (обратный слэш) для экранирования, вот скрипт и "почистил" примерчик.
Заметил что круглые скобки были не нужны.


Цитата:
Originally posted by Andius
Блин, ну эта хрень ведь во всех форумах сделана. Неужели никто не может предоставить готовый работающий код?



Готовый код? Форумы разные бывают, это ж надо исходники твоего форума смотреть. :)

Цитата:
Originally posted by Andius

Но присутствуют глюки: Если цитируешь в одной строке, например
...
то все нормально, а если цитируешь что-то больше одной строки, например
...
то нифига не цитируется, т.е. код не обрабатывается...



Думаю что это не глюк, просто скорее всего [q] не расчитана на использование более чем 1-й строки, к твоему форуму скорее всего нужно написать отдельную функцию для цитирования текста из >1 строк. А может в конфиге скрипта форума смотреть надо.

Цитата:
Originally posted by Andius

Если в сообщении присутствуют двойные кавычки " , то сообщение не добавляется.
В то же время у меня на локалке все работает нормально. Это глюк с хостом? Как его можно обойти?



Возможно на хостинге, так же как на этом форуме, срабатывает защита от взлома. Попробуй экранировать двойные кавычки.

338
16 октября 2004 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by NightSleeper
Думаю что это не глюк, просто скорее всего [q] не расчитана на использование более чем 1-й строки, к твоему форуму скорее всего нужно написать отдельную функцию для цитирования текста из >1 строк. А может в конфиге скрипта форума смотреть надо.


Ну зачем так сразу. Это не глюк, само собой. Просто любая себя уважающая регексина воспринимает текст ПОСТРОЧНО, т.е. до конца строки, если не указано обратное. Зреть в модификаторы.


Цитата:

Возможно на хостинге, так же как на этом форуме, срабатывает защита от взлома. Попробуй экранировать двойные кавычки.


Магик квотесы. Читать.

1.9K
16 октября 2004 года
Andius
61 / / 04.01.2004
Так, часть проблемы я уже решил.
Нашел код:
 
Код:
$post = preg_replace("/(\[)(q)(])(\r\n)*(.*)(\[\/q\])/siU", "<blockquote class='quot'>\\5</blockquote>", $post);

Работает нормально даже если несколько строк. НО! Есть одно НО:
Если цитата находится в цитате, вот так:
 
Код:
[q][q][q]цитата[/q][/q][/q]

то происходят глюки. Оно в каком-то не совсем нужном порядке обрабатывается. А это не есть гуд.
Как сделать, чтобы все было нормально?


p.s. и что такое магик квотесы?
338
17 октября 2004 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by Andius
... чтобы все было нормально?


p.s. и что такое магик квотесы?


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

287
18 октября 2004 года
Shiizoo
958 / / 14.03.2004
Цитата:
Originally posted by Andius
Работает нормально даже если несколько строк. НО! Есть одно НО:
Если цитата находится в цитате, вот так:
 
Код:
[q][q][q]цитата[/q][/q][/q]

то происходят глюки. Оно в каком-то не совсем нужном порядке обрабатывается. А это не есть гуд.
Как сделать, чтобы все было нормально?



Ну, естессна у тебя ниче с этим твоим
"$post = preg_replace("/([)(q)(])(\r\n)*(.*)([/q])/siU", "<blockquote class='quot'>\5</blockquote>", $post);"
паттерном не выйдет, пока у тебя ungreedy флаг стоит:) Он находит [q], потом ищет [/q], но не самую последнюю, какую найдет, а близжайшую, U - для паттернов как бы антоним к жадности:) Непойму еще зачем в этом примере квадратные скобки брались в круглые, гм, достаточно заэкранить первую в каждой паре, и всё.. Зачем в паттерне присутствует (\r\n)* ??? При включенном флаге /s .* (и другие вариации) считает символы перевода строки и т.п. за обычные символы, а значит (.*) было бы вполне достаточно... :)

perl`е я знач нарисовал такую штуку:

 
Код:
my $z = "[q][q][q]bz\
\
\gfg
[/q]\n\r[/q][/q]\n";

while ($z =~ s,\[q](.*)\[/q],"<blockquote class='quot'>".$1."</blockquote>",sie) {};

print $z;


В пхп не особо парю и винда щас голая, проверить негде, так что думай сам, никаких сложностей у тебя возникнуть (по идее) не должно:)

p.s.: а вообще, я считаю что пользоваться для такой ерунды регэкспами может.. глупо?.. лучше, как мне кажется, воспользоваться index, substr, rindex и т.п. (не знаю как они в php незаываюцца)ъ...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог