Foros del Web » Programando para Internet » PHP »

Ayuda con expresión regular

Estas en el tema de Ayuda con expresión regular en el foro de PHP en Foros del Web. Hola gente, hace un par de días estoy luchando para hacer una expresión regular que haga lo siguiente: extraer de una cadena de texto todos ...
  #1 (permalink)  
Antiguo 19/01/2008, 15:05
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Ayuda con expresión regular

Hola gente, hace un par de días estoy luchando para hacer una expresión regular que haga lo siguiente: extraer de una cadena de texto todos los signos de pregunta (?) siempre y cuando estos signos no esten dentro de comillas simples o dobles ("?") ni tampoco con comillas y espacios (" ? ").

Osea dentro de una cadena de este tipo:
Código PHP:
INSERT INTO tabla (col1col2col3col4col5VALUES (?, "?"" ? "" ?", ? ) 
debería extraer solo el primer y último signo de pregunta, ya que los del medio están entre comillas (y algunos comillas y luego espacios).

He llegado a una expresión que hace justo lo contrario... me extrae los signos del medio y me excluye los que quiero extraer, pero no encuentro forma de "invertirla" para conseguir justo lo contrario:
Código PHP:
$s='INSERT INTO tabla (col1, col2, col3, col4, col5) VALUES (?, "?", " ? ", " ?", ? )';
preg_match_all('/[\"\']\s*(\?)\s*[\"\']/'$s$m);
print_r($m); 
Muchas gracias de antemano.
Saludos.
__________________
R4DS en español | R4DS en inglés
  #2 (permalink)  
Antiguo 19/01/2008, 15:59
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Ayuda con expresión regular

creo que podría servirte esta:

'/[^"]\s*\?[^"]\s*/'

"un caracter que NO es una comilla, cualquier cantidad de espacios, un signo ?, cualquier cantidad de espacios, y un caracter que NO es una comilla."


Saludos.
  #3 (permalink)  
Antiguo 19/01/2008, 19:28
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Re: Ayuda con expresión regular

Muchas gracias por la respuesta alvlin.

La estuve probando (casi la misma expresión que me facilitaste tu, pero invirtiendo la parte trasera: [^"]\s*\?\s*[^"]) y agarra en la cadena el primero (?) y el último ( ? ) pero también agarra el del medio (" ? ").

Analizando un poco llego a la conclusión de que captura el signo central debido a que toma como que no hubiera espacios alrededor del ? (por la posibilidad del 0 del *) y toma a estos espacios como el caracter que puede ser cualquiera menos comillas... entonces hay coindicencia con el patrón.

La verdad que no paro de darle vueltas a este problema y sigo sin encontrar solución.

Te agradezco mucho la ayuda brindada y espero que me puedan seguir dando una mano.

Saludos.
__________________
R4DS en español | R4DS en inglés
  #4 (permalink)  
Antiguo 20/01/2008, 08:53
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Ayuda con expresión regular

Cita:
pero invirtiendo la parte trasera
Sí, fue un error mío. La tuya es la forma correcta.

Entiendo el problema.
Podrías hacerlo así:

'/[^"\s]\s*\?\s*[^"\s]/'

pero eso solamente serviría para los casos en los que hay 1 solo espacio.
Se me ocurre que tal vez podrías analizar la cadena antes y eliminar espacios duplicados, con eso te harías la vida más fácil...


Saludos.
  #5 (permalink)  
Antiguo 20/01/2008, 14:50
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Re: Ayuda con expresión regular

Perfecto, me parecio una buena idea.

Finalmente el código para reemplazar los ? quedó:
Código PHP:
$s='INSERT INTO tabla (col1, col2, col3, col4, col5) VALUES (?, "?", " ? ", "?", ? )';
echo 
preg_replace(array('/\s{2,}/''/([^"\s]\s*)(\?)(\s*[^"\s])/'), array(' ''$1reemplazo$3'), $s); 
Para extraerlos con preg_match_all es similar solo que primero se le quitarían los espacios dobles, triples, etc con preg_replace...

Nuevamente muchas gracias por la ayuda.
__________________
R4DS en español | R4DS en inglés
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 12:44.