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.

¿Fue útil?

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)/", "&#160;", $str);

(Opté por el # 160 ya que Markdown analiza nbsp.)

Resultados en:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;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("&nbsp;", 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top