Foros del Web » Programando para Internet » PHP »

Ayuda con una expresión regular sencilla

Estas en el tema de Ayuda con una expresión regular sencilla en el foro de PHP en Foros del Web. Aquí novateando con las expresiones regulares... Necesito limpiar HTML de caracteres especiales '&nbsp;', pero quiero que permanezcan las estructuras '<p>&nbsp;</p>'. He confeccionado esta expresión: Código ...
  #1 (permalink)  
Antiguo 01/09/2010, 19:41
 
Fecha de Ingreso: septiembre-2007
Mensajes: 99
Antigüedad: 17 años, 1 mes
Puntos: 0
Ayuda con una expresión regular sencilla

Aquí novateando con las expresiones regulares...
Necesito limpiar HTML de caracteres especiales '&nbsp;', pero quiero que permanezcan las estructuras '<p>&nbsp;</p>'. He confeccionado esta expresión:
Código PHP:
'/[^(<p>)]&nbsp;[^(<\/p>)]/' 
pero no entiendo por qué, no funciona (respeta las estructuras definidas pero limpia sólo aleatoriamente los '&nbsp;').
¿Qué expresión es la que estoy buscando?
  #2 (permalink)  
Antiguo 01/09/2010, 19:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Ayuda con una expresión regular sencilla

creo que estas confundido....

los [] solo sirven para agrupar conjuntos de caracteres, no frases completas...

para negar frases completas a la izquierda debes usar (?<!), y a la derecha (?!)

te invito a leer lo siguiente:
http://www.forosdelweb.com/f18/aport...s-pcre-646110/

una última cosa... <p>&nbsp;</p> no es nada correcto, y suponiendo que solo esperas generar un salto de linea con ello bien puedes usar <br />
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 01/09/2010, 19:49
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Ayuda con una expresión regular sencilla

¿Algo así?
Código PHP:
Ver original
  1. <?php
  2. $str = '<p>&nbsp;</p>&nbsp;&nbsp;&nbsp;&nbsp;<div>&nbsp;</div>';
  3. $str = preg_replace('/(<p>&nbsp;<\/p>)|&nbsp;/i', '$1', $str);
  4. echo $str;

Edito:
Estoy de acuerdo con pateke que no es nada correcto el uso de <p>&nbsp;</p>, sino usar lo que corresponde, semánticamente hablando.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 01/09/2010, 19:50
 
Fecha de Ingreso: enero-2009
Ubicación: Neiva, Huila
Mensajes: 196
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda con una expresión regular sencilla

Completamente de acuerdo con pateketrueke, estas siendo poco ortodoxo... y estas usando mal la expresion regular.....no hay na mas que decir ...buen trabajo pateketrueke.
  #5 (permalink)  
Antiguo 02/09/2010, 03:30
 
Fecha de Ingreso: septiembre-2007
Mensajes: 99
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Ayuda con una expresión regular sencilla

@abimaelrc:
No, si te fijas bien tu expresión borra las dos formas, que es lo que no quiero. Gracias de todos modos.

@pateketrueke
Gran pequeño tutorial de expresiones regulares has hecho. Ni sabía que existían esos Modificadores de Sub patron y captura. Usándolos me he acercado mucho a la meta pero no, al final es mucho más sencillo hacer lo que quiero con una función, aunque esto me ha ayudado a estudiar las expresiones regulares, que es siempre lo que voy dejando en php para el final. Gracias.

Con respecto a la ortodoxia, tengo que decir que los '<p>&nbsp;</p>' los mete el tinyMCE por defecto que es con el que proceso decenas de megas de texto en mi web. Mecanizar el cambio de esa expresión por '<br />' no tiene sentido, ya que:
1) el <br /> en sí mismo es una marcación bastante retrógrada y casi obsoleta
2) el manejo del <br /> como espaciador por los diferentes navegadores es muy disparejo
Lo único sensato sería mecanizar el cambio por declaraciones css, lo único realmente ortodoxo y coherente. Mi web valida XHTML 1.0 Strict casi de cabo a rabo así que todas estas pijerías las tengo muy en cuenta. Pero a veces la rapidez y la efectividad priman...
  #6 (permalink)  
Antiguo 02/09/2010, 05:39
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Ayuda con una expresión regular sencilla

Te equivocas. Tratala antes de analizarla.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 02/09/2010, 09:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Ayuda con una expresión regular sencilla

Cita:
Iniciado por vega22 Ver Mensaje
Con respecto a la ortodoxia, tengo que decir que los '<p>&nbsp;</p>' los mete el tinyMCE por defecto que es con el que proceso decenas de megas de texto en mi web. Mecanizar el cambio de esa expresión por '<br />' no tiene sentido, ya que:
1) el <br /> en sí mismo es una marcación bastante retrógrada y casi obsoleta
2) el manejo del <br /> como espaciador por los diferentes navegadores es muy disparejo
Lo único sensato sería mecanizar el cambio por declaraciones css, lo único realmente ortodoxo y coherente. Mi web valida XHTML 1.0 Strict casi de cabo a rabo así que todas estas pijerías las tengo muy en cuenta. Pero a veces la rapidez y la efectividad priman...
estas pero si muy equivocado... <br /> no es ni retrograda, ni obsoleto... además todos lo navegadores lo manejan igual: es un salto de linea!!

te invito a que mires las especificaciones desde HTML4, xHTML1 y HTML5

todas estas especificaciones lo contemplan con el salto de linea regular, y natural del mismo marcaje.... ¿de donde has sacado tremenda gilipollez?

y con respecto a TinyMCE te puedo asegurar que se puede configurar para que en lugar de párrafos vacíos te inserte saltos de linea... ¿si entiendes la diferencia entre un párrafo vacío y un salto de linea verdad?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 02/09/2010, 11:07
 
Fecha de Ingreso: enero-2009
Ubicación: Neiva, Huila
Mensajes: 196
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda con una expresión regular sencilla

Desde que tengo memoria y desde que iniciaba usaba para salto de Linea el <br> y nunca me ha puesto problemas en ningún navegador...todos lo manejan igual...=)......y ps..aun lo sigo usando sin ningun problema de interpretacion en los navegadores XD
  #9 (permalink)  
Antiguo 02/09/2010, 11:45
 
Fecha de Ingreso: septiembre-2007
Mensajes: 99
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Ayuda con una expresión regular sencilla

Si sois capaces de decir la tremenda barbaridad de que navegadores como IE6/7 e IE8/FF/Chrome etc. manejan igual el tag <br /> está claro cuánto sabéis de maquetación web y lo finos que os deben salir los trabajos XD. Como todo el mundo sabe, hasta el más pardillo, cada navegador maneja a su forma también los <p> y los <hx>, y las diferencias en el <br /> usado como espaciador o multiespaciador son bastante más radicales.

TinyMCE es el primero en desaconsejar el uso de <br /> para otra cosa que no sea para lo que está: dar un salto de línea. Y por supuesto que desde que tenemos memoria lo usamos... Por eso posiblemente en xhtml2 desaparezca, porque es más viejo que Matusalén.

Cita:
Te equivocas. Tratala antes de analizarla.
Está probada incluso. Borra todo, ya que captura el patrón antes de | y el patrón después de |. La solución va por los subpatrones, pero aunque he logrado que me respete el patrón espaciador y me borre todos los nbsp sueltos, me deja los que van seguidos de </p> y los que van precedidos de <p>. De todos modos ya digo que con una sencilla función con str_replace el tema queda zanjado, aunque no de un modo tan elegante, claro.

Última edición por vega22; 02/09/2010 a las 11:54
  #10 (permalink)  
Antiguo 02/09/2010, 12:27
 
Fecha de Ingreso: enero-2009
Ubicación: Neiva, Huila
Mensajes: 196
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda con una expresión regular sencilla

Mmmm...ps haber te digo mis aplicaciones....que son bastantes y van desde sencillas hasta complejas, desde viejitas a recientes ....con respecto al <br /> no he tenido problemas...en ningun navegador.......ps si quieres muestrame un codigo de los que manejas donde la interpretación del <br /> por los navegadores sea dispareja...

fresh....
  #11 (permalink)  
Antiguo 02/09/2010, 12:31
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Ayuda con una expresión regular sencilla

No puede borrar los que están en <p>&nbsp;</p> porque yo le indico que esos los añada. Si te fijas hay, en el segundo parametro $1. Si copias y pegas fielmente ese código verás que no se borra.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 02/09/2010, 12:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Ayuda con una expresión regular sencilla

Cita:
Iniciado por vega22 Ver Mensaje
Si sois capaces de decir la tremenda barbaridad de que navegadores como IE6/7 e IE8/FF/Chrome etc. manejan igual el tag <br /> está claro cuánto sabéis de maquetación web y lo finos que os deben salir los trabajos XD. Como todo el mundo sabe, hasta el más pardillo, cada navegador maneja a su forma también los <p> y los <hx>, y las diferencias en el <br /> usado como espaciador o multiespaciador son bastante más radicales.
te invito a demostrar con hechos lo que planteas... además de que no existe ningún tag <hx/>

y de verdad, quiero que lo sustentes.... pues todos van a decir que el pardillo eres tu, los hechos hablan!!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 02/09/2010, 13:24
Avatar de Rafael
Modegráfico
 
Fecha de Ingreso: marzo-2003
Mensajes: 9.028
Antigüedad: 21 años, 8 meses
Puntos: 1826
Respuesta: Ayuda con una expresión regular sencilla

Quizá un poco offtopic del tema de la expresión regular.
Un <br /> es claramente un salto de linea, a diferencia de un salto de párrafo, por lo que es un elemento necesario digamos en la escritura de un poema o una canción. No veo por qué tenga que desaparecer.

Supongo que el salto de linea dentro de un párrafo de texto se debe tratar exactamente como eso, una linea vacía del mismo alto que una linea de texto llena, en el caso de haber 2 <br /> consecutivos. En el caso de un solo <br /> debe simplemente enviar el siguiente caracter a la linea siguiente.

Si un <br /> reacciona diferente es probablemente por la estructura padre que lo contiene, ya que debe de heredar ciertos atributos de estilo como el line-height, o sus variantes de font-size.

Soy un poco ignorante del tema en realidad.

Última edición por Rafael; 02/09/2010 a las 13:33
  #14 (permalink)  
Antiguo 02/09/2010, 14:27
 
Fecha de Ingreso: enero-2010
Mensajes: 191
Antigüedad: 14 años, 10 meses
Puntos: 7
Respuesta: Ayuda con una expresión regular sencilla

Cita:
Iniciado por pateketrueke Ver Mensaje
te invito a demostrar con hechos lo que planteas... además de que no existe ningún tag <hx/>

y de verdad, quiero que lo sustentes.... pues todos van a decir que el pardillo eres tu, los hechos hablan!!!
En mi opinión el ñomo tiene razón, cada navegador trabajas los elementos html según sus propias especificaciones, claro esta que desde el invaluable arachne hasta estos días las diferencias no son tan grotezcas pero existen.

Más que de navegador debería haber diferenciado en engine, pero el razonamiento es bueno.

La etiqueta <hx> se refiere a h1, h2, etc...

Igualmente ambas preguntas muchachos y ambas respuestas son capciosas, porque uno se refiere a la función visual que presta la etiqueta al renderizarse y el otro habla de como queda en función de tamaños... estamos grande para discuciones de nenes.

PD: q fucking es pardillo?
  #15 (permalink)  
Antiguo 02/09/2010, 15:52
 
Fecha de Ingreso: enero-2009
Ubicación: Neiva, Huila
Mensajes: 196
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda con una expresión regular sencilla

ps por eso compañero demuestrame que el <br /> tiene un funcinamiento diferente en todos los navegadores....
escriban

un <html>
con

alfredo
<br />
Ernesto
<br />

y ejecutenlo en los navegadores y me dicen =)
  #16 (permalink)  
Antiguo 02/09/2010, 17:17
 
Fecha de Ingreso: septiembre-2007
Mensajes: 99
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Ayuda con una expresión regular sencilla

Cita:
Iniciado por abimaelrc Ver Mensaje
No puede borrar los que están en <p>&nbsp;</p> porque yo le indico que esos los añada. Si te fijas hay, en el segundo parametro $1. Si copias y pegas fielmente ese código verás que no se borra.
Es verdad, yo cambié las variables para adaptarlas a mi script por eso no iba. Bien, ese es el modo en que lo he resuelto yo (añadiendo las cadenas válidas que antes ha borrado), pero usando una línea más y str_replace. Creo que tu fórmula es la mejor de todas las que se pueden emplear. Es posible que no exista expresión regular ninguna que haga lo que quiero sin tener que reañadir lo antes eliminado.

Tema <br /> cuidadosamente explicao para el insistente naciostars :
Obviamente nadie usa en un texto un párrafo vacío como salto de línea. Un <p></p> se usa como espaciador entre párrafos que trata de mantener las proporciones en el flujo del texto. Si usas <br /> como salto de línea, para lo que está hecho, su comportamiento será similar en todos los navegadores, aunque habrá variaciones menores debidas al distinto manejo de las proporciones del texto en cada uno de ellos. Yo uso constantemente <br /> como salto de línea. Semánticamente es para lo que está hecho, y nada más. Pero úsalo como espaciador, por ejemplo:

Esteban<br /> <-salto de línea
<br /> <-espaciador
Julián

y ya verás el espacio tan diferente que hay entre ambos nombres entre los antiguos IE y los nuevos nanegadores. Así de simple. Si en vez de un <br /> usas dos o más, las diferencias se hacen cada vez más patentes.

Usar <br /> para espaciar texto es pésimo en la práctica y en la teoría patea toda la coherencia semántica.

Por otro lado, mirad en esta página el debate abierto sobre extirpar el <br /> o no como salto de línea en xhtml2: http://www.w3.org/TR/xhtml2/mod-text.html (sección 9.15)

Pero espaciar, hay que espaciar. Lo cual puede convertirse en algo muy complejo, sobre todo si queremos que las cosas queden como esperamos en los IE6/7, que tienen severos problemas con el flujo del texto. ¿Qué uso? principalmente estilos, como debe ser. Margin-tops por aquí, margin-bottoms por allá. Es muy engorroso y trabajoso, pero se hace. ¿Qué pasa si tengo prisa? Que dejo que el TinyMCE meta algún que otro párrafo vacío como espaciador en el flujo de texto. ¿Por qué no lo hago más, cuando es un método bastante práctico que da muy buenos resultados? Porque escucho demasiado a los ortodoxos. Pero, en realidad, si lo pensamos bien, semánticamente es correctísimo usar un párrafo vacío <p></p> si quieres que haya un espacio doble entre dos párrafos que conserve la proporción del flujo de texto. Lo ideal es separar párrafos con distancias iguales a la altura de un párrafo, y para ello lo super lógico es usar un párrafo. Vacío, claro.

Así de simple.

Introducir el dichoso &nbsp; en medio se hace para los IE, que si no, consideran que <p></p> es igual a nada.

Con esto espero dejar zanjada de una vez esta discusión paralela de críos sobre si hacemos los deberes de la escuela como dice el maestro o no. Aquí estábamos para las expresiones regulares y no para complicarnos más la vida unos a otros.
  #17 (permalink)  
Antiguo 02/09/2010, 18:39
 
Fecha de Ingreso: enero-2009
Ubicación: Neiva, Huila
Mensajes: 196
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda con una expresión regular sencilla

Ps si el debate era sobre las expresiones regulares y la desviamos....por eso debo una disculpa.
  #18 (permalink)  
Antiguo 03/09/2010, 08:15
 
Fecha de Ingreso: septiembre-2007
Mensajes: 99
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Ayuda con una expresión regular sencilla

@naciostars:
Pelillos a la mar. No pasa nada. Espero al menos haber dejado claro qué es lo que estoy haciendo y por qué. Luego cada maestrillo (aprendicillo en mi caso) que siga su librillo...

Al final no voy a poder usar ninguna fórmula para purgar los nbsp porque he recordado que muy de tarde en tarde los uso para lo que están: para crear frases irrompibles. Cuando vuelva a usar una, que será seguramente en meses, no me voy a acordar del script y me la va a desarmar sin darme yo cuenta. Crear una expresión regular que respete las aleatorias frases irrompibles sí que me parece algo de verdad imposible de conseguir...

Etiquetas: regular, sencilla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:18.