Теги в стиле bbcode с preg - PullRequest
       6

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

0 голосов
/ 01 апреля 2010

Хорошо, я работал над набором строковых замен для тегов стиля 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, но мне нужна функция, которая может работать с любым количеством тегов-кавычек!

EDIT:

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

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

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

1 Ответ

2 голосов
/ 01 апреля 2010

Попробуйте 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]'
    );
...