更多优质内容
请关注公众号

PHP基础(九) PHP的正则表达式(中)-张柏沛IT博客

正文内容

PHP基础(九) PHP的正则表达式(中)

栏目:PHP 系列:PHP基础系列 发布时间:2019-11-25 16:46 浏览量:2042

字符串边界限制

在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。“^”和“$”分别指定字符串的开始和结束。

例如,在字符串“Tom and Jerry chased each other in the house until tom’s uncel come in”中
元字符“^”或“\A” 置于字符串的开始确保模式匹配出现在字符串首端;
/^Tom/
元字符“$”或“\Z” 置于字符串的结束,确保模式匹配出现字符串尾端。
/in$/    
如果不加边界限制元字符,将获得更多的匹配结果。
/^Tom$/精确匹配        /Tom/模糊匹配

 

单词边界限制

在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。

例如:在字符串“This island is a beautiful land”中
元字符“\b”对单词的边界进行匹配;
/\bis\b/  匹配单词“is”,不匹配“This”和“island”。
/\bis       匹配单词“is”和“island”中的“is”,不匹配“This”
元字符“\B”对除单词边界以外的部分进行匹配。
/\Bis\B/  将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。
/\Bis       匹配单词“This”中的“is”

 

重复匹配

正则表达式中有一些用于重复匹配某些原子的元字符:“?”、“*”、“+”。他们主要的区别是重复匹配的次数不同。

元字符“?”:表示0次或1次匹配紧接在其前的原子。
例如:/colou?r/匹配“colour”或“color”。
元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。
例如:/zo*/可以匹配z、zoo
元字符“+”:表示1次或多次匹配紧接在其前的原子。
例如:/go+gle/匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。

 

 任何一个字符

元字符“.”匹配除换行符外任何一个字符。

相当于:[^\n](Unix系统)或[^\r\n](windows系统)。
例如:/pr.y/可以匹配的字符串“prey”、“pray”或“pr%y”等。
通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。
例如:
/^a.*z$/表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。
/.+/ 也可以完成类似的匹配功能所不同的是其至少匹配一个字符。
/^a.+z$/ 匹配“a%z”不匹配字符串“az”。

 

重复匹配

元字符“{ }”准确地指定原子重复的次数,指定所匹配的原子出现的次数。

“{m}”   表示其前原子恰好出现m次。
“{m,n}”表示其前原子至少出现m次,至多出现n次。
“{m,}” 表示其前原子出现不少于m次。
例如:
/zo{1,3}m/ 只能匹配字符串“zom”、“zoom”、或“zooom”。
/zo{3}m/   只能匹配字符串“zooom”。
/zo{3,}m/ 可以匹配以  “z” 开头,“m”结束,中间至少为3个“o”的字符串。 
/bo{0,1}u/ 可以匹配字符串“bought a butter”  中的“bou”和“bu”,等价于bo?u。

 

原子表 -方括号表达式

原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个 ”a” 或 ”e” 使用 [ae]。

例如: Pr[ae]y 匹配 ”Pray” 或者 ”Prey ”。
原子表 ”[^]” 或者称为排除原子表,匹配除表内原子外的任意一个字符。
例如:/p[^u]/匹配“part”中的“pa”,但无法匹配“computer”中的“pu”因为“u”在匹配中被排除。
原子表“[-]”用于连接一组按ASCII码顺序排列的原子,简化书写。  
例如:/x[0123456789]/可以写成x[0-9],用来匹配一个由 “x” 字母与一个数字组成的字符串。
例如:
/[a-zA-Z]/匹配所有大小写字母
/^[a-z][0-9]$/匹配比如“z2”、 “t6” 、“g7”
/0[xX][0-9a-fA-F]/匹配一个简单的十六进制数字,如“0x9”。
/[^0-9a-zA-Z_]/匹配除英文字母、数字和下划线以外任何一个字符,其等价于\W。 
/0?[ xX][0-9a-fA-F]+/匹配十六进制数字,可以匹配“0x9B3C”或者“X800”等。
/<[A-Za-z][A-Za-z0-9]*>/可以匹配“<P>”、“<hl>”或“<Body>”等HTML标签,并且不严格的控制大小写。

 

模式选择符

元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。
例如:
在字符串“There are many apples and pears.”中, /apple|pear/在第一次运行时匹配“apple”;
再次运行时匹配“ pear”。也可以继续增加选项,如:    /apple|pear|banana|lemon/

 

模式单元

元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。

例如:
/(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”,因为紧接着“+”前的原子是元字符“()”括起来的字符串“Dog”。
/You (very )+ old/匹配“You very old”、“You very very old”
/Hello (world|earth)/匹配“Hello world”、“Hello earth”
一个模式单元中的表达式将被优先匹配或运算。

 

系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“\1”、“\2”、“\3”的形式进行引用。当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“\\1”、“\\2”

例如:
/^\d{2}([\W])\d{2}\\1\d{4}$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式。这是因为模式“[\W]”的结果“/”已经被存储。下个位置“\1”引用时,其匹配模式也是字符“/”。
当不需要存储匹配结果时使用非存储模式单元“(?:)” 
例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)\\2g/。

 

全匹配符

.* 可以匹配任何长度的任何字符(换行除外)

.*? 拒绝贪婪模式的全匹配符

例如:

<?php
$str1 = "
			  <ul>
				  <li>aaaa</li>
				  <li>bbbb</li>
				  <li>cccc</li>
			  </ul>
			";
	$patt = "/<li>.*?<\/li>/";
	
	preg_match_all($patt,$str1,$res);
//可以匹配到所有的li元素

/*

array (size=1)
  0 => 
    array (size=3)
      0 => string '<li>aaaa</li>' (length=13)
      1 => string '<li>bbbb</li>' (length=13)
      2 => string '<li>cccc</li>' (length=13)

*/
?>

 

PHP中常用的正则表达式

1 匹配HTML标签:

/<[\/\!]?[^<>]+>/is

 

2 匹配url:

/(?:https?:\/\/)?(?:[\w-]+\.)+\w+\/?.*?/iU

 

3 匹配手机号:

/^1\d{10}$/

 

4 匹配邮箱

/\w+@\w+(?:\.\w+)+/i

 

 




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > PHP基础(九) PHP的正则表达式(中)

热门推荐
推荐新闻