2014-02-13 56 views

回答

5

你可以使用\b,如:

\bb=(\d+) 

其中仅在单词边界(\w而不是\w之间)相匹配。

+0

完美!谢谢。真的很感谢所有其他答案的家伙!让他们继续来。 – Prasanth

+1

Word Boundries,没有想到这一点,聪明。 – Martijn

+0

我意识到vim中的单词边界。 Vim很聪明! :) – Prasanth

0

这是我得到:

(?:[^a-zA-Z])(?:b=(\d+)) 

(?:[^a-zA-Z])它不能以-Z开始。你可能想改变这一点,但你的想法 (?:b=(\d+))我把它包在一组,使正则表达式结合起来,?:确保\\1仍将20

+1

不适用于第二和第三种情况。 – Toto

1

使用negative lookbehind

/(?<!a)b=(\d+)/ 

现在,这将匹配任何数字后跟b=,如果没有前面的字符a

测试用例:

$array = array(
    "ab=10&b=20", 
    "b=20&ab=10", 
    "b=20", 
    "ab=10" 
); 

foreach ($array as $str) { 
    if (preg_match('/(?<!a)b=(\d+)/', $str, $matches)) { 
     echo $matches[1], PHP_EOL; 
    } else { 
     echo "No match", PHP_EOL; 
    } 
} 

输出:

20 
20 
20 
No match 

Demo