Удаление первой новой строки preg_replace
-
13-09-2019 - |
Вопрос
Я пишу немного 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
)
(Возможно, это немного излишне в данном случае, должен ли я добавить - но в любом случае приятно знать)