php正则贪婪匹配与非贪婪匹配一些例子

作者:袖梨 2022-06-25

贪婪模式匹配的原则是:

在可匹配也可不匹配的情况下, 优先匹配,直到不能匹配成功的情况下,记录备选状态,并把匹配控制交给正则表达式的下一个匹配字符,当之后的匹配失败的时候,再回溯,进行匹配。
它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所以说它是贪婪的。

举例说明:

preg_match 函数会返回第一个匹配的字符串。
现在有下面字符串

 代码如下 复制代码
$str= "Nothing can replace a mother's love."

现在想要获取第一个replace的内容。

1.贪婪匹配

 代码如下 复制代码

$str= "Nothing can replace a mother's love.";
 
// 贪婪匹配返回最大的字符串
$IsMatch= preg_match('/(.*)/', $str, $match);
if( $IsMatch ){
  print_r($match) . "n" ;
}
/*
输出:
Array
(
   
[0] => replace a mother
   
[1] => replace a mother
)
*/
?>

没有得到想要的内容。贪婪匹配返回最大的字符串。

非贪婪匹配


“?”当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

例:

 代码如下 复制代码

preg_replace('/

/i','',$str);//匹配“”;

preg_replace('/

/i','',$str);//匹配“”;


preg_replace('/

/i','',$str);//匹配“”;也等效于preg_replace('//isU','',$str);

 

另外:用$1,$2……$9可以提取()中的值。


具体方法有两种使用修饰符U或者是?。

 代码如下 复制代码

$str= "Nothing can replace a mother's love.";
 
// 使用?非贪婪匹配返回最小的字符串
$IsMatch= preg_match('/(.*?)/', $str, $match);
if( $IsMatch ){
  print_r($match) . "n" ;
}
/*
输出:
Array
(
   
[0] => replace
   
[1] => replace
)
*/
 
?>

再看

 代码如下 复制代码


$str= "Nothing can replace a mother's love.";
 
// 使用U非贪婪匹配返回最小的字符串
$IsMatch= preg_match('/(.*)/U', $str, $match);
if( $IsMatch ){
  print_r($match) . "n" ;
}
/*
输出:
Array
(
   
[0] => replace
   
[1] => replace
)
*/
 
?>

非贪婪匹配得到了想要的结果

比如下面这个例子:

字符串:....src="http://www.111com.net /1.mp3" type="application/x-mplayer2" ....
要求的结果:http://www.111com.net /1.mp3

如果匹配表达式写为:/src="(.*)"/,则得不到正确的结果,因为最后一个双引号的匹配是贪婪模式的。

解决办法:匹配表达式写为:

 代码如下 复制代码
/src="(.*)".?/

上面表达式中,".?是非贪婪模式匹配。也就是说,只要在一个字符后面跟上限定个数的特殊字符,匹配就是非贪婪模式了。

相关文章

精彩推荐