регулярные выражения
Недавно обнаружил множество ошибок в коде своей гостевой книги. Особенно волнуют регулярные выражения. Я делаю ответ с цитированием - текст выделяется особым образом. В тело сообщения просто вставляется текст:
где $author - имя автора, которого цитируют, а $post - сама цитата.
Так вот, как сделать с помощью регулярных выражений, чтобы этот текст заменялся следующим:
<div class='quot'>$author
$post</div>
bbcode... или как там.
Надеюсь, что суть понятна!
Никто не знает? Или просто вопрос не понятен?
Не понятно: зачем тут применять рег. выражения? Эта гостевая книга написана тобой? ;) Если да, то ты не стеснён переписать тот фрагмент кода где формируется строка
переписать так, чтобы вместо неё выводился нужный текст:
<div class='quot'>$author
$post</div> :???:
Маленькое добавление (не суть): я бы выводил строку:
<div $css_class>$author
$post</div>
Что касается применения регулярного выражения, то здесь не так сложно, приведу один из возможных вариантов, если я правильно понял проблему:
поиск с заменой (опробовано в Perl ActiveState)
print "Было: ".$my_string."\n";
$my_string =~ s/\[q=(\$author)\](\$post)\[\/q\]/<div class='quot'>$1<\/b>
$2<\/div>/;
print "Стало: ".$my_string."\n";
основная конструкция здесь
s/искомое/то чем нужно заменить/;
в искомом (в А) в круглые скобки взято то, что нужно перенести в строку результата, содержимое первых круглых скобок в результате (в Б) пишется $1, содержимое вторых - $2.
Инджой :D
Блин, ну эта хрень ведь во всех форумах сделана. Неужели никто не может предоставить готовый работающий код? Гостевуху я пишу сам.
Вот как я сейчас использую рег. выражения:
Это так называемое цитирование. Но присутствуют глюки: Если цитируешь в одной строке, например
то все нормально, а если цитируешь что-то больше одной строки, например
первая строка
вторая строка
[/q]
то нифига не цитируется, т.е. код не обрабатывается...
И еще вопрос:
Я пользуюсь услугами бесплатного хостинга dhost.info. И почему-то в моей гостевухе происходит такой вот глюк:
Если в сообщении присутствуют двойные кавычки " , то сообщение не добавляется.
В то же время у меня на локалке все работает нормально. Это глюк с хостом? Как его можно обойти?
Не знаю, твой пример почему-то не работает.
Причина того что мой примерчик не работает - я не учёл что на этом форуме в целях безопасности отбрасываются эскейп-символы (обратный слэш) для экранирования, вот скрипт и "почистил" примерчик.
Заметил что круглые скобки были не нужны.
Блин, ну эта хрень ведь во всех форумах сделана. Неужели никто не может предоставить готовый работающий код?
Готовый код? Форумы разные бывают, это ж надо исходники твоего форума смотреть. :)
Но присутствуют глюки: Если цитируешь в одной строке, например
...
то все нормально, а если цитируешь что-то больше одной строки, например
...
то нифига не цитируется, т.е. код не обрабатывается...
Думаю что это не глюк, просто скорее всего [q] не расчитана на использование более чем 1-й строки, к твоему форуму скорее всего нужно написать отдельную функцию для цитирования текста из >1 строк. А может в конфиге скрипта форума смотреть надо.
Если в сообщении присутствуют двойные кавычки " , то сообщение не добавляется.
В то же время у меня на локалке все работает нормально. Это глюк с хостом? Как его можно обойти?
Возможно на хостинге, так же как на этом форуме, срабатывает защита от взлома. Попробуй экранировать двойные кавычки.
Думаю что это не глюк, просто скорее всего [q] не расчитана на использование более чем 1-й строки, к твоему форуму скорее всего нужно написать отдельную функцию для цитирования текста из >1 строк. А может в конфиге скрипта форума смотреть надо.
Ну зачем так сразу. Это не глюк, само собой. Просто любая себя уважающая регексина воспринимает текст ПОСТРОЧНО, т.е. до конца строки, если не указано обратное. Зреть в модификаторы.
Возможно на хостинге, так же как на этом форуме, срабатывает защита от взлома. Попробуй экранировать двойные кавычки.
Магик квотесы. Читать.
Нашел код:
Работает нормально даже если несколько строк. НО! Есть одно НО:
Если цитата находится в цитате, вот так:
то происходят глюки. Оно в каком-то не совсем нужном порядке обрабатывается. А это не есть гуд.
Как сделать, чтобы все было нормально?
p.s. и что такое магик квотесы?
... чтобы все было нормально?
p.s. и что такое магик квотесы?
Нормально это как? Вложенные квоты отрабатываются как одна или вложение как то отображается. Скажи четко что на что менять и я скажу тебе как.
магик квотесы - смотри по форуму, в мануал загляни, есть там про это.
Работает нормально даже если несколько строк. НО! Есть одно НО:
Если цитата находится в цитате, вот так:
то происходят глюки. Оно в каком-то не совсем нужном порядке обрабатывается. А это не есть гуд.
Как сделать, чтобы все было нормально?
Ну, естессна у тебя ниче с этим твоим
"$post = preg_replace("/([)(q)(])(\r\n)*(.*)([/q])/siU", "<blockquote class='quot'>\5</blockquote>", $post);"
паттерном не выйдет, пока у тебя ungreedy флаг стоит:) Он находит [q], потом ищет [/q], но не самую последнюю, какую найдет, а близжайшую, U - для паттернов как бы антоним к жадности:) Непойму еще зачем в этом примере квадратные скобки брались в круглые, гм, достаточно заэкранить первую в каждой паре, и всё.. Зачем в паттерне присутствует (\r\n)* ??? При включенном флаге /s .* (и другие вариации) считает символы перевода строки и т.п. за обычные символы, а значит (.*) было бы вполне достаточно... :)
perl`е я знач нарисовал такую штуку:
\
\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 незаываюцца)ъ...