Extracción de primera línea nueva preg_replace
-
13-09-2019 - |
Pregunta
Estoy escribiendo algo de PHP para convertir Bbcode a HTML.
Me gustaría convertir este BBcode:
[quote]
Hello World
[/quote]
a lo siguiente:
<blockquote>Hello World</blockquote>
La función preg_replace que estoy usando para llevar a cabo esto es:
preg_replace("/\[quote\](.+?)\[\/quote\]/s", "<blockquote>\\1</blockquote>", $bbCode);
Esto casi hace todo lo que necesito, pero mi problema es que lleva a través del \ n de antes y después de 'Hello World', y produce:
<blockquote>
Hello World
</blockquote>
¿Alguna idea de cómo podría solucionar este problema? Todo tipo de ayuda muy apreciada.
Solución
Probar expresión regular:
/\[quote\]\s*(.+?)\s*\[\/quote\]/s
Otros consejos
Es necesario escapar las barras invertidas dentro de las comillas dobles. En lugar de, es necesario "\\ [". "\ ["
Una posibilidad sería utilizar el 'e
' regex-modificador , para llamar, por ejemplo, la función trim
en la cadena.
Citando la página del manual:
e (
PREG_REPLACE_EVAL
)
Si se aplica este modificador,preg_replace()
hace la sustitución normal de referencias hacia atrás en la sustitución cadena, lo evalúa como código PHP, y utiliza el resultado para la sustitución de la cadena de búsqueda. Las comillas simples, dobles citas, barras invertidas (\
) yNULL
caracteres se escaparon por barras invertidas en backreferences sustituidos.Sólo
preg_replace()
utiliza esta modificador; que es ignorado por otra PCRE funciones.
Por ejemplo, este código, sólo ligeramente diferente a la suya:
$bbCode = <<<STR
[quote]
Hello World
[/quote]
STR;
$output = preg_replace("/\[quote\](.+?)\[\/quote\]/es", "'<blockquote>' . trim('\\1') . '</blockquote>'", $bbCode);
var_dump($output);
¿Quieres que dar:
string '<blockquote>Hello World</blockquote>' (length=36)
es decir, la función trim
se denomina en lo que estaba emparejado - señalar que se eliminarán todos los espacios en blanco al principio y al final de la cadena; no sólo nuevas líneas, sino también espacios y tabulaciones.
(Por ejemplo, se puede echar un vistazo a Ejemplo # 4 en el página del manual de preg_replace
)
(Es tal vez un poco exagerado en este caso, debo añadir - pero es bueno saber de todos modos)