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.

¿Fue útil?

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í:

http://us3.php.net/manual/en /function.nl2br.php#39641

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