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
)
)
所以就是说[ ]只能匹配单个字符
PHP从零开始学正则表达式
936

被折叠的 条评论
为什么被折叠?



