Теги стиля bbcode с preg

Хорошо, я работал с набором замен строк для тегов стиля bbcode на моем форуме, замена [b] и [i] и т. д. довольно проста, поскольку я могу заменить их напрямую без проблем.

Есть два тега, которые доставляют мне проблемы, так как то, что мне нужно с ними делать, более сложное. [quote] и [url] — это хорошо, но я хотел бы предоставить пользователям выбор между [quote=person_to_quote] и [url=URL]link text[/url], тэг [quote=] тоже должен быть вложенным!

Поэтому мне нужно иметь возможность заменить открывающий тег [quote=, затем сохранить строку, добавить ], показать цитату, а затем закончить [/quote]. Я могу полностью заменить теги и сохранить штраф =person, но это делается с помощью обмана и простого добавления конечного тега к тексту. Что я действительно хотел бы сделать, так это вытащить все, что находится между = и ], чтобы я мог манипулировать им по отдельности.

В настоящее время я использую массив и просто заменяю встроенный текст следующим образом:

    "[quote=" is replaced by "<span class=\"quote\">[Quote: ",

и просто отбрасывать незамещенный текст обратно в конец, хотя это некрасиво. Что я хотел бы сделать, так это взять код, говорящий [quote=person]some text here[/quote], и превратить его в:

    "[quote=" is replaced by "<span class=\"quote\">$person says: ",

где $person будет переменной, в которой хранится имя человека, чтобы его можно было заменить динамически.

Аналогично с URL-адресами, которые я хотел бы заменить [url=link]link text[/url] и сделать так, чтобы он мог принимать URL-адрес и заменять его встроенным, поэтому вывод:

"[url=" is replaced by "<a href=$URL>"

с уже закрытым тегом html, что означает удаление URL-адреса, его сохранение и последующая замена.

Итак, какой метод я использую для удаления текста между = и закрывающими тегами ], чтобы то, что я передаю в массив замены, могло быть передано и изменено соответствующим образом. Кроме того, я не беспокоюсь о вложенности в quotes, поскольку стиль класса span позаботится об этом, но мне нужна функция, которая может работать с любым количеством тегов кавычек! Пожалуйста, подумайте.

РЕДАКТИРОВАТЬ:

Просто обновление, я решил то, что хотел сделать, я изменил код, который дал мне webbiedave, и он работает:

$output = preg_replace_callback(
'/\[quote=([^\]]+)?\]/',
create_function(
'$matches',
'return \'<span class="quote">\'.$matches[1].\' says: \';'
),
$comment);

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


person TooManyCooks    schedule 01.04.2010    source источник


Ответы (1)


Попробуйте preg_replace_callback:

$output = preg_replace_callback(
        '/\[quote=([^\]]+)?\]([^\[]+)?\[\/quote\]?/',
        create_function(
            '$matches',
            'return \'"[quote=" is replaced by "<span class=\"quote\">\'.$matches[1].\' says: ",\';'
        ),
        '[quote=person]some text here[/quote]'
    );
person webbiedave    schedule 01.04.2010
comment
Хм, это заменяет все парные теги, если я правильно понимаю? Вывод в порядке, поскольку он дает мне класс span, но ему не нужно искать теги конечных кавычек? Поскольку оба тега заменяются, изменяется вложенность, и он не будет работать с вложенными кавычками. Конечный тег можно заменить вторым проходом, поэтому его не нужно включать. Поэтому мне нужно изменить это, чтобы заменить только часть [quote=chris] на <span class="quote">Chris says <br />, добавив еще одну замену для закрывающего тега, чтобы устранить проблемы вложенности. - person TooManyCooks; 01.04.2010
comment
Ааа, спасибо, я немного неправильно прочитал, он искал текст между тегами, но не заменял конечный тег, я взял этот бит и немного изменил его. Но +1 за точку в правильном направлении! - person TooManyCooks; 01.04.2010
comment
Рад, что смог помочь. Вместо того, чтобы давать вам полное решение, я просто хотел проиллюстрировать, как эту функцию можно использовать для решения вашей проблемы. - person webbiedave; 01.04.2010
comment
да, я добавил модифицированный код выше для справки, спасибо за указатель, регулярное выражение все еще пугает меня! - person TooManyCooks; 01.04.2010