2011-05-16 104 views
3

例如,我有以下代码:需要一些帮助,正则表达式(PHP)

$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. 

我试图获得的第一个值(10)。上面的代码输出40是有道理的,但不是我想要的。字符串模式是:单词“值”,然后是一些任何字符,然后是“(”,integer,“)”。看来我错过了一些明显的东西......我对正则表达式并没有太多的工作,但我相信它可以用?<!value以某种方式解决,尽管如此,没有运气。

感谢您的任何帮助。

回答

3

.*是贪婪的,所以它会匹配尽可能多的字符可能的话,你想.*?将匹配完成比赛所需要的最小字符:

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

非常感谢,这是那么容易:) – a1ex07 2011-05-16 20:23:05

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

是*?一场不情愿的比赛。

2

有什么不对您的正则表达式是*是贪婪,并尽量匹配尽可能多的字母。

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

但是你可以通过使用负类使其更快:

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