Вопрос

Я пишу немного PHP для преобразования BBCode в HTML.

Я хотел бы преобразовать этот BBCode:

[quote]
Hello World
[/quote]

к следующему:

<blockquote>Hello World</blockquote>

Функция preg_replace, которую я использую для выполнения этого, является:

preg_replace("/\[quote\](.+?)\[\/quote\]/s", "<blockquote>\\1</blockquote>", $bbCode);

Это почти делает все, что мне нужно, но моя проблема в том, что оно переносит \ n из до и после 'Hello World' и производит:

<blockquote>
Hello World
</blockquote>

Есть какие-нибудь идеи, как я мог бы это исправить?Любая помощь очень ценится.

Это было полезно?

Решение

Попробуйте это регулярное выражение:

/\[quote\]\s*(.+?)\s*\[\/quote\]/s

Другие советы

Вам нужно избегать обратной косой черты внутри двойных кавычек.Вместо "\[" вам нужно "\\[".

Одной из возможностей было бы использовать 'e' регулярное выражение-модификатор, чтобы вызвать, например, trim функция в строке.

Цитирую эту страницу руководства :

e (PREG_REPLACE_EVAL)
Если этот модификатор установлен, preg_replace() выполняет обычную замену обратных ссылок в заменяемой строке, оценивает ее как PHP-код и использует результат для замены строки поиска.Одинарные кавычки, двойные кавычки, обратная косая черта (\) и NULL символы будут экранированы обратной косой чертой в замененных обратных ссылках.

Только preg_replace() использует этот модификатор;это игнорируется другими функциями PCRE .


Например, этот код, лишь немного отличающийся от вашего :

$bbCode = <<<STR
[quote]
Hello World
[/quote]
STR;

$output = preg_replace("/\[quote\](.+?)\[\/quote\]/es", "'<blockquote>' . trim('\\1') . '</blockquote>'", $bbCode);
var_dump($output);

Дал бы тебе :

string '<blockquote>Hello World</blockquote>' (length=36)

т.е., тот trim функция вызывается для того, что было сопоставлено - обратите внимание, что это удалит все пробелы в начале и конце вашей строки ;не только новые строки, но также пробелы и таблицы.

(Например, вы можете взглянуть на пример № 4 на страница руководства по preg_replace)
(Возможно, это немного излишне в данном случае, должен ли я добавить - но в любом случае приятно знать)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top