1.学习前的例子
2.工具
至于辅助的工具 网上是有那么一种工具,或者现在工具网站也有很多,帮助你测试组装你的正则表达式
3.首先来认识下 正则中的几种字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
表4.模式修饰符
模式修饰符的作用是设定模式,也就是正则表达式如何解释。php中主要模式如下表:
修饰符 | 说明 |
---|---|
i | 忽略大小写 |
m | 多文本模式 |
s | 单行文本模式 |
x | 忽略空白字符 |
4.转义
5 下面来一点例子。
$patterns = "/\d+/"; //第一种
$strs="left:0px;top:202px;width:90px;height:30px";
preg_match_all($patterns,$strs,$match);
echo '<pre>';
print_r($match);
Array ( [0] => Array ( [0] => 0 [1] => 202 [2] => 90 [3] => 30 ) )
2.加了限定符
^once 该模式与字符串"once upon"匹配,与"There once ..."不匹配
^a{2,4}$ aa,aaa或aaaa
^a{1,3}$ a,aa或aaa
^a{2,}$ 包含多于两个a的字符串
^a{2,} 如:aardvark和aaab,但apple不行
a{2,} 如:baad和aaa,但Nantucket不行
$patterns = "/\d{11}/"; //第一种 也可以这样 /1[3458]\d{9}/ 方括号表示第二个数字只能是3或4或5或8
$strs="你好,我的手机号是15916882974";
preg_match($patterns,$strs,$match);//和preg_match_all不同,这个是匹配到的第一个
echo '<pre>';
print_r($match);
Array ( [0] => 15916882974 )
4.判断字符串”I am a good boy”中是否包含单词go
$pattern=’/\bgo\b/’;
5.正则匹配图片
/<(img|IMG).+?\/>/i
6.匹配字符串 'php'
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "查找到匹配的字符串 php。";
} else {
echo "未发现匹配的字符串 php。";
}
正则中说的 贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。
这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
再比如:
$str = '<td>bread1</td><td>bread2</td>';
preg_match('/<td>(.*)<\/td>/',$str,$res);
print_r($res);
$str = '<td>bread1</td><td>bread2</td>';
preg_match('/<td>(.*?)<\/td>/',$str,$res);
print_r($res);
进阶篇
1.匹配图片的src
$patterns = "/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i";
$strs="<img src='img1.jpg' alt='rererere'/><IMG src='img2.jpg' title='223'/>";
preg_match($patterns,$strs,$match);
echo '<pre>';
print_r($match);
输出:
Array ( [0] => <img src="img1.jpg" alt="rererere"> [1] => img1.jpg )
可以看到这里的匹配结果img1.jpg ,也是使用了懒惰的匹配模式。img和src之间如果用.* 有可能一直匹配到图片的尾部。这里用了懒惰匹配就保证匹配的是
img和src之间的最短距离.
2.匹配邮件格式
$patterns = "/\d{1,}@.*?\.(com|cn)/i";
$strs="hello,my email is 100023@qq.com。And liming's email is 66666@sina.cn 。welcome join us!";
preg_match_all($patterns,$strs,$match);
选择字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”与”()”的区别,在于”[]”只能匹配单个字符,而”()”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。
所以这里的表达式中的(com|cn) 如果改成 [com|cn] ,就会 输出
Array
(
[0] => Array
(
[0] => 100023@qq.c
[1] => 66666@sina.c
)
)
所以就是说[ ]只能匹配单个字符