8正则表达式考察点,php正则贪婪匹配与非贪婪匹配一些例子

的下一个匹配字符,在可匹配也可不匹配的情况下,它会匹配尽可能多的字符,正则表达式的作用,延伸正则表达式的组成及编写方法,至少写出一种验证139开头的11为的手机号码的正则表达式

图片 12

贪婪模式匹配的原则是:

至少写出一种验证139开头的11为的手机号码的正则表达式

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

思考
手机号码的正则表达式的编写
延伸正则表达式的组成及编写方法

举例说明:

正则表达式的作用:分割、查找、匹配、替换字符串

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

分隔符:正斜线(/)、hash符号(#)以及取反符号(~)

 代码如下

通用原子:\d \D \w \W \s \S

$str= “Nothing can <b>replace</b> a
<b>mother</b>’s love.”

元字符: . * ? ^ $ + {n} {n,m} [] () [^] | [-]

现在想要获取第一个<b>replace</b>的内容。

模式修正符: i m e s U x A D u

1.贪婪匹配

i 不区分大小写
m 将我们字符串的每一行去进行匹配,,前提是你们那里面有换行。
e 是我们进行replace里面的语句,去进行一个PHP语句的处理。

 代码如下

s 是修正 点的换行
U是取消。。。
x 忽略我们模式中的

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

A

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

D
u

非贪婪匹配

后向引用
贪婪模式

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

后向引用
$str = ‘<b>abc</b>’;

例:

$pattern = ‘<b>.*</b>’;
//去除掉<b>
preg_replace($pattern,’\1′,$str);

 代码如下

\1替换的就是第一个括号的里面的东西,只要第一个括号里面的东西

preg_replace(‘/<td
(.*?)>/i’,'<td>’,$str);//匹配“<td”后出现的第一个“>”;

图片 1

preg_replace(‘/<td
(.*)>/i’,'<td>’,$str);//匹配“<td”后出现的最后一个“>”;

Paste_Image.png

preg_replace(‘/<td
(.*?)>/i’,'<td>’,$str);//匹配“<td”后出现的第一个“>”;也等效于preg_replace(‘/<td
(.*)>/isU’,'<td>’,$str);

贪婪模式
$str = ‘<b>abd</b><b>bcd</b>’;

 

$pattern = ‘/<b>.* </b>/’;

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

preg_replace_all($pattern,’\1′,$str);

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

这是因为是贪婪的。

 代码如下

图片 2

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

Paste_Image.png

再看

.*? 这就是取消贪婪模式。

 代码如下

图片 3

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

第二种方式

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

图片 4

.*? 和U 不能同时用

比如下面这个例子:

正则表达式里面的PCRE函数
preg_match() preg_match_all() preg_replace(0 preg_split()

字符串:….src=”%20/1.mp3″
type=”application/x-mplayer2″ ….
要求的结果:%20/1.mp3

一般不会考

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

图片 5

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

Paste_Image.png

 代码如下

图片 6

/src=”(.*)”.?/

Paste_Image.png

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

图片 7

Paste_Image.png

$match 是匹配到的内容。

会匹配到 “中文”
如果没有+ 只会匹配到 “中”

图片 8

Paste_Image.png

先写出一个要匹配的字符串
自左向右的顺序使用正则表达式的院子和元字符进行拼接
最终加入模式修正符
不要死记硬背模式

//139 8888 8888
//
$str = ‘13988888888’;
$pattern = ‘/^139\d{8}$/’;
preg_match($pattern,$str,$match);

一网打尽
请写一个正则表达式,匹配页面中所有img标签中的src值。

$str = ‘

图片 9

‘;

$pattern = ‘/<img.?src=”.\?”.*?/?>/i’;
preg_match($pattern,$str,$match);

图片 10

Paste_Image.png

$str = ‘

图片 11

‘;
$pattern = ‘/<img.?src=”(.\?)”.*?/?>/i’;
preg_match($pattern,$str,$match);

加上一个()之后,就是后向引用。。。会取出src的值

图片 12

Paste_Image.png