Foros del Web » Programando para Internet » PHP »

Expresiones regulares, caracter de negacion

Estas en el tema de Expresiones regulares, caracter de negacion en el foro de PHP en Foros del Web. Hola, siempre que acudo aquí es cuando rebuscando por internet ni probando todos los recursos he conseguido solucionarlo. Espero que me podais ayudar. Como se ...
  #1 (permalink)  
Antiguo 02/06/2009, 16:10
Avatar de NzO
NzO
 
Fecha de Ingreso: abril-2005
Mensajes: 153
Antigüedad: 18 años, 11 meses
Puntos: 3
Expresiones regulares, caracter de negacion

Hola, siempre que acudo aquí es cuando rebuscando por internet ni probando todos los recursos he conseguido solucionarlo. Espero que me podais ayudar.

Como se puede negar la aparicion de un caracter es decir:

Código Cadena:
Ver original
  1. 'Si esta es toda' mi 'cadena' que 'puede llevar ?' 'o una @ o una ~ #' 'pero esta separado por comillas simples'


Como harias para capturar todos los contenidos de las comillas, seria:
- Si esta es toda
- cadena
- puede llevar ?
- o una @ o una ~ #
- pero esta separado por comillas simples

El problema esque esto que es lo que pruebo no vale:
'(.*)'
Porque devuelve esto:
Si esta es toda' mi 'cadena' que 'puede llevar ?' 'o una @ o una ~ #' 'pero esta separado por comillas simples

Como hariais eso? Porque he probado de mil formas y no hay manera:

'([^'].*)'
'(([^'].)*)'

En fin no lo consigo, si alguien se le ha presentado este problema alguna vez y ha sabido solucionarlo, le estaria muy agradecido de verdad.

Un saludo, y gracias de antemano.
__________________
NzO=EnZo
isiAJAX & isiXML hechos el uno para el otro.
  #2 (permalink)  
Antiguo 02/06/2009, 16:19
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 8 meses
Puntos: 416
Respuesta: Expresiones regulares, caracter de negacion

:P Es que usando /'(.*)'/ es Greedy Matching. Que no se detiene hasta que encuentra el ULTIMO.

/'(.*?)'/ //non-greedy matching
  #3 (permalink)  
Antiguo 02/06/2009, 17:30
Avatar de NzO
NzO
 
Fecha de Ingreso: abril-2005
Mensajes: 153
Antigüedad: 18 años, 11 meses
Puntos: 3
Respuesta: Expresiones regulares, caracter de negacion

OMG!

No te puedes imaginar cuanto trabajo me has ahorrado con eso y cuanto me hubiese ahorrado. Increible. xD

No sabes lo que te agradezco que me hayas enseñado eso, enserio. La de vueltas que he tenido que dar en algunas ocasiones para conseguirlo madre mia.

Mil gracias de verdad. Y ya que estas no conceras alguna web que te de informacion sobre tecnicas avanzadas de expresiones regulares verdad?

Un saludo.
__________________
NzO=EnZo
isiAJAX & isiXML hechos el uno para el otro.
  #4 (permalink)  
Antiguo 02/06/2009, 22:18
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 8 meses
Puntos: 416
Respuesta: Expresiones regulares, caracter de negacion

Lo poco que se de expresiones regulares lo he leído en libros de PHP y de ModRewrite.

Pero deben haber libros muy buenos en la red.

Solo un aporte mas para quien se tope con este tema:

Cuando usas (.*), greedy matching, la expresion regular traga lo mas que pueda hasta encontrar un caracter que la detenga.
Si aplicamos la expresion regular /c(.*)n/ a la palabra "canadian", mostrara: "anadia".

Mientras que usando non-greedy matching, (.*?), la expresion regular traga lo menos posible, por lo que aplicando /c(.*?)n/ a la cadena "canadian" devolveria: "a"

EDIT: Busque mi libro de ModRewrite, y la lectura que el autor recomienda para expresiones regulares (porque en ese libro no lo cubren todo) es: Mastering Regular Expressions, Second Edition, by Jeffrey Friedl

Última edición por Ronruby; 02/06/2009 a las 22:28
  #5 (permalink)  
Antiguo 03/06/2009, 00:17
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Respuesta: Expresiones regulares, caracter de negacion

Muyyyy buen libro tambien me sirvio a mi jeje
  #6 (permalink)  
Antiguo 03/06/2009, 01:45
Avatar de NzO
NzO
 
Fecha de Ingreso: abril-2005
Mensajes: 153
Antigüedad: 18 años, 11 meses
Puntos: 3
Respuesta: Expresiones regulares, caracter de negacion

Muchas gracias de nuevo Ronruby. Ya que estamos lanzo otra pregunta que alguna vez se me ha presentado el problema y no he sabido solucionarlo. Tiene que ver con el problema expuesto al principio.

Código En la cadena:
Ver original
  1. 'Si esta es toda' mi 'cadena' que 'puede llevar ?' 'o una @ o una ~ #' 'pero esta separado por comillas simples'

Se puede hacer para que niegue la aparicion de un caracter especifico?
Por ejemplo la @?
Es decir que con esto /'(.*?)'/ me los encuentre todos menos el que contiene una @. Eso es posible hacer?
__________________
NzO=EnZo
isiAJAX & isiXML hechos el uno para el otro.
  #7 (permalink)  
Antiguo 03/06/2009, 14:58
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 8 meses
Puntos: 416
Respuesta: Expresiones regulares, caracter de negacion

Código php:
Ver original
  1. <?php
  2.  
  3. $cadena = "'Si esta es toda' mi 'cadena' que 'puede llevar ?' 'o una @ o una ~ #' 'pero esta separado por comillas simples'";
  4. preg_match_all("/'([^@]*?)'/i", $cadena, $matches);
  5. echo '<pre>';
  6. print_r($matches);
  7.  
  8. ?>

Solo tienes que cambiar el "." (cualquier caracter) por [^@] (cualquier caracter menos @, aun usando greedy matching)
  #8 (permalink)  
Antiguo 03/06/2009, 16:41
Avatar de NzO
NzO
 
Fecha de Ingreso: abril-2005
Mensajes: 153
Antigüedad: 18 años, 11 meses
Puntos: 3
Respuesta: Expresiones regulares, caracter de negacion

Guay :D Esta bien saber como se niega la aparicion de un caracter en una busqueda. De todas formas esa regexp no va bien porque cuando encuentra el caracter a eliminar deja de encontrar.
Pero bueno esto tampoco necesito saberlo era solo por curiosidad, muchas gracias :)

PD: Yo uso http://www.spaweditor.com/scripts/regex/index.php para hacer pruebas de expresiones regulares ;)

Un saludo.
__________________
NzO=EnZo
isiAJAX & isiXML hechos el uno para el otro.
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 18:54.