Foros del Web » Programando para Internet » PHP »

REGEX "todo lo que NO esté seguido por MISTRING"

Estas en el tema de REGEX "todo lo que NO esté seguido por MISTRING" en el foro de PHP en Foros del Web. hola, recibo éste STRING en post: Código: FUENTEUNO <font size="4">FUENTEDOS <font size="7">FUENTETRES</font> <font color="#ff8c00">NARANJA</font> <font color="#0000ff">AZÚL</font><br /></font> y lo quiero pasar a "HTML bien formado" ...
  #1 (permalink)  
Antiguo 04/03/2021, 07:33
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 10 meses
Puntos: 22
REGEX "todo lo que NO esté seguido por MISTRING"

hola, recibo éste STRING en post:
Código:
FUENTEUNO
<font size="4">FUENTEDOS
<font size="7">FUENTETRES</font>
<font color="#ff8c00">NARANJA</font>
<font color="#0000ff">AZÚL</font><br /></font>
y lo quiero pasar a "HTML bien formado" que sería:
Código:
FUENTEUNO
<font size="4">FUENTEDOS</font>
<font size="7">FUENTETRES</font>
<font color="#ff8c00">NARANJA</font>
<font color="#0000ff">AZÚL</font>
y solo tengo ésta REGEX:
Código PHP:
preg_match_all('/(<font.*?>.*?)<font.*?>/'$_POST['elhtml'], $html); 
pero no sé cómo colocar el CIERRE (</font>) en la coincidencia [0].

Es decír, creo que me ayudaría una REGEX que procese:

"tóma TODO entre <font.*?> y <font.*?> y que NO ESTÉ seguido por </font>"

pero no sé como colocar la condición: "que NO ESTÉ seguido por </font>"

gracias por la ayuda
  #2 (permalink)  
Antiguo 04/03/2021, 09:49
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Respuesta: REGEX "todo lo que NO esté seguido por MISTRING"

por lo visto quieres evitar anidaciones, yo pienso que primero deberias hacer un SPLIT a todo el string
algo como

Código PHP:
Ver original
  1. <?php
  2. $lineas = split("<font",$html);
  3. foreach($lineas as &$linea){
  4.    if(stripos($linea,'</font') >0)){ //todo correcto tiene cierre del TAG
  5.  
  6.    }else{//no tiene cierre del TAG y le agregamos uno por que la siguiente linea viene otro FONT
  7.       $lineas .= '</font>'
  8.    }
  9. }
  10. //y volvemos a armar de nuevo el string
  11. $html = implode("<font",$lineas);

bueno eso es un ejemplo stricto, ya que tambien puede surgir ciertos casos como '<Font' <FONT , etc u otras etiquetas, todo depende de tu imaginacion, un implode puede ser mas util que una expresion regular la expresion regular consume mas recursos que un strpos ,explode
tenlo en cuenta
puedes consultar

https://www.php.net/strpos
https://www.php.net/explode
y el favorito
https://www.php.net/manual/es/function.strip-tags.php
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #3 (permalink)  
Antiguo 04/03/2021, 15:24
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 10 meses
Puntos: 22
Respuesta: REGEX "todo lo que NO esté seguido por MISTRING"

Cita:
Iniciado por tuadmin Ver Mensaje
...
Código PHP:
Ver original
  1. <?php
  2. $lineas = split("<font",$html);
  3. foreach($lineas as &$linea){
  4.    if(stripos($linea,'</font') >0)){ //todo correcto tiene cierre del TAG
  5.  
  6.    }else{//no tiene cierre del TAG y le agregamos uno por que la siguiente linea viene otro FONT
  7.       $lineas .= '</font>'
  8.    }
  9. }
  10. //y volvemos a armar de nuevo el string
  11. $html = implode("<font",$lineas);
...
gracias por la ayuda tuadmin siguiendo tu consejo, acondiciono el wysiwyg que he creado utilizando document.execCommand para que séa XHTML válido, pues con JS he removido la parte W3C que se agrega al interactuar con el wysiwyg:
Código:
document.getElementById('elhtml').value = Q.replace(/ xmlns="http:\/\/www.w3.org\/1999\/xhtml" /g, ' ');
y ahora con PHP lo preparo para ser XHTML:
Código PHP:
if(!empty($_POST['elhtml'])){
    
$elhtml $_POST['elhtml'];
    echo 
'HTML original:<textarea style="width:100%;height:8%;font-size:1.2em;">'.$elhtml.'</textarea>';

// divido el HTML recibido en líneas:
    
$elhtml preg_replace('/<font .*?>/'"\n$0"$_POST['elhtml']);
    echo 
'HTML con saltos de línea:<textarea style="width:100%;height:13%;font-size:1.2em;">'.$elhtml.'</textarea>';

    while(
preg_match('@(<br />\s*|</font>\s*)$@s'$elhtml)){echo 1;
        
$elhtml preg_replace('@(<br />\s*|</font>\s*)$@s'''$elhtml);
        }
    echo 
'HTML sin tags al final:<textarea style="width:100%;height:33%;font-size:1em;">'.print_r($elhtml1).'</textarea>';
    echo 
'HTML procesado:<textarea style="width:100%;height:100%;font-size:1em;">';

    
$elhtml explode("\n"$elhtml);
    
$HTML '';
    foreach(
$elhtml AS $n => $L){
        if(
$n && !preg_match('@(</font>)$@'$L))$L $L.'</font>';
        
$HTML .= $L."\n";
        }
    echo 
$HTML;
    } 
no sé por qué no se créa un XHTML válido de manera nativa, sin embargo con tu explode espero poderlo manejar.

Gracias
  #4 (permalink)  
Antiguo 05/03/2021, 10:47
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Respuesta: REGEX "todo lo que NO esté seguido por MISTRING"

bueno por lo visto estas usando algun wysiwyg , y por ello, te sugeria varias cosas, primero, puedes procesar mejor desde el LADO del cliente, el formato del HTML. y mas todavia si tus funciones son orientadas a navegadores modernas

podrías eliminar etiquetas indeseadas, recorrerlas con document.querySelectorAll; podrias en caso de encontrar anidacion. sacar ese elemento afuera, todo desde el lado del CLiente, y con los navegadores modernos trabajar con el DOM mas satisfactoriamente. mas potente, en el proceso de enviar el Formulario, capturar el dato del HTML, ponerlo en DIV, temporal, y manejar todos esos elementos de ese DIV o usar algo no recuerdo bien era algo con el nombre de SHADOW, que hacia que los elementos q insertases no se vieran afectados por eventos globales de tu sitio web, y demas, ejeje

en resumen mi sugerencia,e s que en tu wysiwyg hagas el proceso de validacion o purga del html
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #5 (permalink)  
Antiguo 06/03/2021, 09:21
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 10 meses
Puntos: 22
Respuesta: REGEX "todo lo que NO esté seguido por MISTRING"

Cita:
Iniciado por tuadmin Ver Mensaje
... que en tu wysiwyg hagas el proceso de validacion o purga del html
gracias TuAdmin debido a que el comando insertBrOnReturn me dá errores, lo he CAMBIADO por
Código:
document.execCommand('insertHTML', false, '<br />\n\u200C');
y por ello he debido modificar la línea del wysiwyg que límpia el código:
Código:
Q.replace(/\u200C|\n|xmlns="http:\/\/www.w3.org\/1999\/xhtml" /g, '');
finalmente, había olvidado agregar la línea PHP:
Código PHP:
$elhtml str_replace('</font>'''$elhtml); 
y ahora sí el HTML se convierte en XHTML válido

Salu2!

Etiquetas: regex, todo
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 22:34.