Ayuda con una expresión regular que las tiras de liderazgo espacio en blanco
Pregunta
Estoy modificando una función básica de la Kohana de la biblioteca, la texto: auto_p() la función.
La función se describe a sí mismo como "nl2br() en esteroides".Básicamente, proporciona <br />
solo los saltos de línea, pero con el doble de los saltos de línea son rodeados con la <p>
las etiquetas.
La limitación que he encontrado es que se pero <br />
s en un <pre>
elemento.Esto va a crear el doble de las nuevas líneas, que no es lo que quiero.He hecho una modificación para recoger los elementos pre con una expresión regular, y una devolución de llamada que se tira de la <br />
que funciona bien.
Sin embargo, el principal problema es que tengo ejemplos de código en mi texto que se presenta auto_p()
'd, y la necesito para preservar la sangría (para mejorar la legibilidad).Por desgracia para mí, la función de tiras iniciales y finales de espacio en blanco en las líneas.
Aquí es la expresión regular que las tiras de espacio
$str = preg_replace('~^[ \t]+~m', '', $str);
Yo no soy el mejor regex gurú, pero estoy bastante seguro de que dice "Get espacios y tabuladores donde hay al menos uno, y reemplazarlos con una cadena vacía."
He probado la eliminación de esta línea, pero luego se va a agregar <br />
donde definitivamente no desea que ellos - en un caso, yo estaba recibiendo una salida como esta
<ul><br />
<li>something</li>
</ul>
¿Cómo puedo modificar esta expresión o de código para no tira de espacio en el interior de un <pre>
elemento?
El original de la función auxiliar de Kohana está disponible aquí.(desplácese a la casi abajo del todo).
Sé que voy a conseguir un par de 'Uso de un analizador de HTML' tipo de respuestas - y mientras que usted puede estar en lo correcto - el código existente simplemente utiliza regex, y yo preferiría una solución más simple (donde no tengo que incluyen una biblioteca, etc).
Gracias por su tiempo.
Solución
Así es como yo lo haría:
$str = preg_replace(
'~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
'', $str);
Después de comparar algunos espacios en blanco-línea que conduce, la búsqueda hacia delante escanea por delante de las etiquetas o <pre>
</pre>
. La carne de la búsqueda hacia delante es este bit:
(?:[^<]++|<(?!/?+pre\b))*+
Coincide con cero o más de cualquier cosa que no es un ángulo de soporte izquierdo, o un soporte en ángulo izquierda si no es el comienzo de una etiqueta o <pre>
</pre>
. Esa parte sólo se detendrá a juego cuando encuentra una etiqueta <pre>
(de partida), una etiqueta </pre>
(final), o el final de la entrada. Si se trata de una etiqueta de cierre que lo detiene, usted sabe que está dentro de un elemento <PRE>
, por lo que no quiere hacer la sustitución.
Los cuantificadores posesivos ('++'
, '*+'
y '?+'
) son esenciales para evitar retroceso catastrófico . (No puedo evitarlo: esa frase siempre me hace pensar en el cascada de resonancia escenario de Half-Life .)
Esta técnica también asume HTML razonablemente bien formado, es decir, todas las etiquetas <pre>...</pre>
adecuadamente equilibrada. Etiquetas dentro de SGML comentarios voluntad estropearlo, también - a menos que se encuentren equilibrados. Se puede tratar con los comentarios, también, si no le importa lo que la expresión regular el doble y el triple de feo. :)
Otros consejos
Su problema se discute mucho supongo - echa un vistazo a este enlace
http://us3.php.net/manual/en /function.nl2br.php#91828
Éste así: