Cita:
Iniciado por Anarko
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.