Ver Mensaje Individual
  #12 (permalink)  
Antiguo 27/01/2013, 17:13
Avatar de dashtrash
dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Cita:
Iniciado por Anarko Ver Mensaje
Por favor muestras un ejemplo de cómo no encontrar una cadena.

Por ejemplo llevo mas de 50 minutos haciendo combinaciónes y no puedo imprimir únicamente la frase las vocales son aeiou
Código PHP:
    $k='las vocales son aeiou y también xyz';
    
preg_match('/(.*)[^(aeiou)]/',$k,$R);
    echo 
'<pre>';
    
print_r($R); 
Lo que comentaba justo después en el otro mensaje era:
Cita:
(porque las cadenas donde lo vas a aplicar lo permiten),
A lo que me refería, es que cuando lo que quieres hacer match es algo que está dentro de un <option>, en vez de especificar que quieres encontrar "algo seguido de <option>", es mejor especificar "todo aquello que no sea <".
En este caso, aeiou (lo que delimita lo que quieres encontrar, por el lado derecho), forma parte del match que quieres encontrar.No hay un claro delimitador después de lo que quieres hacer match (a diferencia del caso "todo lo que haya dentro del option", donde el delimitador por la izquierda es '>', y por la derecha, '<').
Lo que no tengo claro en este ejemplo (sobre todo por el código que añades después), es dónde debe comenzar el match.
Aparte, la construcción [^ ..] sirve para caracteres, no para expresiones completas.Si lo que quisieras es encontrar algo *no seguido* por otra expresión, tendrías que usar x(?!y) , donde x e y son expresiones completas.
Pero , como decía, este no es tu caso, ya que quieres capturar "aeiou"
Así que, en principio, la regex que puedes usar es /(.*aeiou)/

Ahora bien, y para que veas lo "peligroso" de .*:
.* significa que *todo* hace match.Cuando pones .*, el motor de regex, siempre va a llegar al final de la linea, o del texto que le pases.
Si despúes de .*, en la regex, hay más condiciones, el motor de regex tiene que empezar a ir hacia atrás, buscando algún punto a partir del cual se cumplan el resto de las condiciones que hay detrás de .*
En tu ejemplo, la cadena:
las vocales son aeiou y también xyz

con .*aeiou, significa que el motor, primero va a hacer match de toda la linea.
Cuando ya no tiene más caracteres que consumir, finaliza la recursión de .*.Pero aún quedan condiciones que cumplir.Como no quedan caracteres, la expresión regular falla en el punto en el que está (fin de la cadena).
Así que empieza a volver atrás en la recursión (1 caracter antes del final).El motor comprueba ahora si 'z' cumple toda la regex.No la cumple.Vuelve hacia atrás.
Comprueba si yz cumple toda la regex.No la cumple.Vuelve hacia atrás.
Comprueba si xyz cumple toda la regex.No la cumple.Vuelve hacia atrás...
Así, hasta que vuelva al punto donde está "aeiou".
Ahí , finalmente, hará match.

Ésta es otra versión, más larga, de la misma regex.

/((?:.(?!aeiou))*.aeiou)/

Significa: cualquier caracter que no vaya seguido por aeiou + 1 caracter + aeiou
Es equivalente, pero, como te puedes imaginar, el número de recursiones que usa es mucho menor.