Reemplazo de espacios usando expresiones regulares en PHP
-
03-07-2019 - |
Pregunta
Soy bastante nuevo en expresiones regulares. Tengo el requisito de reemplazar espacios en un texto de varias líneas. Las reglas de reemplazo son estas:
- Reemplace todos los espacios al comienzo de la línea con un espacio que no se rompa (
& amp; nbsp;
). - Reemplace cualquier instancia de espacios repetidos (más de un espacio juntos) con el mismo número de espacios sin interrupciones.
- Los espacios individuales que no están al comienzo de la línea permanecen intactos.
Utilicé el Regex Coach para crear el patrón coincidente:
/( ){2,}|^( )/
Supongamos que tengo este texto de entrada:
asdasd asdasd asdas1
asda234 4545 54
34545 345 34534
34 345
Usando una función de reemplazo de expresiones regulares de PHP (como preg_replace ()
), quiero obtener esta salida:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Estoy contento haciendo simples sustituciones de texto usando expresiones regulares, pero tengo problemas para encontrar la forma de reemplazar varias veces dentro de la coincidencia para obtener la salida que deseo.
Solución
Supongo que sería más fácil encontrar cada espacio y reemplazarlo. Para hacer eso, use " look-ahead " y " look-behind " grupos.
O, encuentre un espacio ( \ x20
) que esté encabezado o seguido por cualquier espacio en blanco ( \ s
); pero, solo reemplaza el espacio.
$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n";
print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", " ", $str);
(Opté por el # 160 ya que Markdown analiza nbsp.)
Resultados en:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Para obtener más información, consulte PCRE y perlre .
responder a los comentarios
@ Sprogz : Al principio, pensé lo mismo. Pero el ejemplo muestra un " \ n " = > " \ n & amp; nbsp; "
entre las líneas 1 y 2.
Otros consejos
Puedes usar el modificador / e
de PHP para ejecutar algún código en el reemplazo, como este:
$str = preg_replace('/( {2,}|^ )/em', 'str_repeat(" ", strlen("\1"))', $str);
He cambiado la expresión regular para capturar los espacios.
El modificador / m
lo pone en modo multilínea, por lo que ^
coincide con el inicio de cualquier línea.