Удаление первой новой строки preg_replace

Я пишу 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>

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


person Joey    schedule 23.09.2009    source источник


Ответы (3)


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

/\[quote\]\s*(.+?)\s*\[\/quote\]/s
person Gumbo    schedule 23.09.2009
comment
Оно работает! :) Я был уверен, что уже пробовал что-то подобное, но, очевидно, нет. Большое спасибо Гамбо - person Joey; 24.09.2009

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

person Jeff Ober    schedule 23.09.2009

Можно было бы использовать 'e' regex-modifier, чтобы вызвать, например, функцию 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)< /em>
(Может быть, в данном случае это немного излишне, должен ли я добавить, но в любом случае приятно знать)

person Pascal MARTIN    schedule 23.09.2009