¿Quieres registrarte?

Convertir un texto en PHP a HTML tal como se envió por HTTP

Por: Zah
16 de Diciembre del 2008
3769 de clabLevel
Otros artículos de Zah
6,051 visitas

Imaginen esta situación: tenemos que hacer que PHP procese un texto plano normal y corriente, y hacer que tras pasar por el script, el texto aparezca en la pantalla del navegador justo como lo enviamos (o con alguna modificación, pero manteniéndose como texto plano). Parece algo obvio e inútil, pero tras pensarlo un poco no me parece ninguna de las dos.

En la situación más sencilla, tendríamos un formulario con un área de texto y un botón para enviarlo a una página en la que se muestra el texto que enviamos, tal cual. Podríamos complicarlo haciendo que busque ciertas cadenas o realice alguna modificación al texto mediante expresiones regulares , o usarlo, por ejemplo, para un sistema de comentarios cutre.

Así pues, el formulario no sería más que:

Código :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulario</title>
</head>
<body>
<form action="resultado.php" method="post">
Texto: &nbsp;&nbsp;
<textarea name="texto" cols="40" rows="7"></textarea>
<input type="submit" name="click" value="enviar"/>
</form>
</body>
</html>


Y ahora veamos qué tendríamos en resultado.php. Lo primero que pensé es que bastaría con:

Código :

<?php
echo $_POST('texto');
?>


Sin embargo, al comprobarlo escribiendo cualquier cosa, nos damos cuenta inmediatamente de que no respeta los saltos de línea, y muestra simplemente un texto continuo en un párrafo, aunque si miramos el código en el navegador, comprobamos que aparece \n en cada salto de línea. Para solucionar eso, hay que usar la función de PHP nl2br, que transforma los saltos de línea de la forma \n a la forma que tienen en html, </br>.

Si seguimos haciendo pruebas y/o pensamos un poco, veremos que si insertamos un código html válido, el navegador lo parseará, en vez de mostrarlo tal cual. Así, si ponemos un texto entre las etiquetas de negrita, <b>texto</b> obtendremos texto, en lugar de la cadena literal que tenemos. Para impedir que el navegador interprete los tags html, podemos convertirlos en sus entidades equivalentes, usando la función htmlentities. Noten que hay que aplicarla antes que la función nl2br, para que no escape también las etiquetas de salto de línea </br>.

Si probamos esto en un servidor local normal, parece que ya está, sin embargo, es posible encontrarse con servidores que escapan por defecto todos los caracteres "peligrosos" (como las comillas) que les envían por POST. Así que, cuando creíamos que el texto ya se mostraba correctamente, al subirlo a un servidor, comprobamos que las comillas se muestran escapadas. Si enviáramos Esto es el "texto", veríamos Esto es el \"texto\". Para contrarrestarlo, hay que aplicar la función stripcslashes. De manera, que al final quedaría así:

Código :

<?php
echo stripcslashes(nl2br(htmlentities($_POST('texto'))));
?>

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas php hack

Comentarios | Enviar un comentario
Muy útil y claramente explicado :D

Gracias
Por: canastendo
Muy bueno Zah. :wink:

Otra opción para mostrar el texto, sin hacerle nada de nada en PHP, es poner el texto dentro de las etiquetas pre, así respeta saltos de línea y caracteres html introducidos.

Código :

echo '<pre>'. $_POST['texto'] .'</pre>'; 

Por: Dano
Muy bueno Zah, me lo había encontrado, hice lo que tú, pero sin lo de los Slashes, eso no lo sabía. :P

@Dano: La etiqueta es esa por alguna razón en concreto o solamente es cuestión de que esté dentro de unas etiquetas sin importar cuales sean? Nunca vi esa etiqueta...
Por: Bleend

Bleend :

@Dano: La etiqueta es esa por alguna razón en concreto o solamente es cuestión de que esté dentro de unas etiquetas sin importar cuales sean? Nunca vi esa etiqueta...
Según entiendo la etiqueta <pre> evita el formateo del texto ante el navegador... Por lo que de poner cualquier otra si habría un cambio notorio.

De hecho, según creo el BBcode de Clab se apoya mucho en ellas, por ejemplo en las tags [as], [mysql], [php], etc.
Por: M@U

Bleend-blog :

Muy bueno Zah, me lo había encontrado, hice lo que tú, pero sin lo de los Slashes, eso no lo sabía. :P

@Dano: La etiqueta es esa por alguna razón en concreto o solamente es cuestión de que esté dentro de unas etiquetas sin importar cuales sean? Nunca vi esa etiqueta...


Tiene que ser afuerzas pre. Se llama pre, porque define texto preformateado. Lo que hace es tratar el contenido como si de texto plano se tratara, respetando todos los espacios en blanco y saltos de línea normales. Así como las tabulaciones. Resulta muy interesante en muchos de los casos. Al ser una etiqueta html, se le pueden aplicar estilos sin problemas, lo comento por si se asustan y ven como texto default un courier, con un estilo CSS pueden cambiarle el font-family.

saludos
Por: Dano
WTF! Ese es exactamente el problema que se me acaba de presentar, y lo digo enserio ya que tengo testigos! Wow... Gracias Zah muy buen Tip...
:o
Por: M@U
Excelnte tip, alguna utilidad le encontrare :D
Por: flashreloco
:o muy interesante lo de la etiqueta pre, nunca la había visto antes y parece que puede ser muy útil :lol:
Por: canastendo
Como hacer para solucionar los ENTER

y que ademas cuando se escriba corrido siga enmarcado en los margenes del textarea, es decir, las dimensiones del text area
Por: Hihger-blog
no me sirve nada pagina mala
Por: felix -blog
gracias, por el tip me ahorro tiempo y un dolor de cabezas.
Por: walter -blog
mmm... no me salió el comentario?
Por: test-blog
Dano... lo de las etiquetas pre no sirve, es para un formulario, imaginate que te meten:

Código :


</pre>

<script type="text/javascript>

while(true) alert('jojojo');

</script>



Por: elias-blog
exelente me acabas de ahorrar 15 minutos haciendo una funcion para sistituir enter y saltos de pagina :)... nice
Por: angel-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.