Necesito ayuda con expresiones regulares (php)

Por ejemplo, tengo el siguiente código:

$string  = "adf  gggg  eere value aaaa bbb (10) value 
ddttt ggg www (20) value ddttt ggg www dddd (40) ";
preg_match("/(value).*(\(\d+\))/is", $string, $result);
var_dump($result[2]); // outputs 40.

Estoy tratando de obtener el primer valor (10). El código anterior genera 40, lo que tiene sentido, pero no es lo que quiero. El patrón de cadena es: palabra "valor", luego un número de cualquier carácter, luego "(", entero, ")". Parece que me estoy perdiendo algo obvio ... No he trabajado demasiado con expresiones regulares, pero creo que se puede resolver de alguna manera con ?<!value, aunque no tuve suerte hasta ahora.

Gracias por cualquier ayuda.

preguntado el 16 de mayo de 11 a las 20:05

3 Respuestas

.* es codicioso, por lo que coincidirá con tantos caracteres como sea posible, desea .*? que coincidirá con los caracteres mínimos necesarios para completar la coincidencia:

/(value).*?(\(\d+\))/

contestado el 17 de mayo de 11 a las 00:05

Muchas gracias, fue tan fácil :) - a1ex07

Lo que está mal con su expresión regular es que. * Es codicioso e intenta hacer coincidir tantas letras como sea posible.

preg_match("#value.*?\((\d+)\)#is", $string, $result);

Pero puedes hacerlo más rápido usando una clase negativa:

preg_match("#value[^(]+\((\d+)\)#is", $string, $result);

contestado el 17 de mayo de 11 a las 00:05

.*?value.*?\((\d+)\).*

Ser *? un partido reacio.

contestado el 17 de mayo de 11 a las 00:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.