我们在写正则表达式的时候,需要确定这样几件事:
1)我们要查什么
2)我们要从哪查
3)我们要查多少
限定符
限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
* 匹配前面的组件零次或多次
+ 匹配前面的组件一次或多次
? 匹配前面的组件零次或一次
{n} 匹配确定的 n 次
{n,} 至少匹配n 次
{n,m} 最少匹配 n 次且最多匹配 m 次
也可以使用以下方式表示:
* {0,}
+ {1,}
? {0,1}
贪婪模式
如果在表达式的后面使用'?',表示非贪婪匹配原则,就会尽可能匹配少的,示例如下:
$reg = '/<.*?>/';
$str = '<span>1111</span><span>222</span>';
preg_match_all($reg, $str, $rst);
var_dump($rst);
array(1) {
[0]=>
array(4) {
[0]=>
string(6) "<span>"
[1]=>
string(7) "</span>"
[2]=>
string(6) "<span>"
[3]=>
string(7) "</span>"
}
}
字符匹配符
字符匹配符用于匹配某个或某些字符
字符簇
[a-z] :表示a-z任意一个字符
[A-Z] :表示A-Z任意一个字符
[0-9] :表示0-9任意一个数字
[0-9a-z] :表示0-9 a-z任意一个字符
[0-9a-zA-Z] :表示0-9 a-z A-Z任意一个字符
[abcd] :表示a 或b 或c 或 d
[1234] :表示 1 或2 或3 或 4
[^a-z] :表示匹配除了a-z之间任意一个字符
[^0-9] :表示匹配除了0-9之间任意一个字符
[^abcd] :表示匹配除a b c d 之外的任意一个字符
\d :匹配一个数字字符。[0-9]
\D :匹配一个非数字字符。[^0-9]
\w :匹配包括下划线的任何单词字符。[0-9a-zA-Z_]
\W :匹配任何非单词字符。[^\w]
\s :匹配任何空白字符 空格、制表符、换行符
\S :匹配任何非空白字符。
. :匹配除 "\n" 之外的任何单个字符 如果想匹配任意字符 [.\n]
定位符
定位符可以将一个正则表达式固定在一行的开始或结束。也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
\b 匹配一个单词边界
\B 匹配非单词边界
转义符
\ 用于匹配某些特殊字符
需要转义的字符有:
(
)
[
]
{
}
\
.
/
*
+
?
^
$
选择匹配符
| 可以匹配多个规则,|两边各是一个选项
$str = 'hello,world,hello,php';
$reg = '/hello,world|php/';//hello,world php
$reg = '/hello,(world|php)/';hello,world hello,php
表达式的分界符
表达式必须用分隔符闭合, 比如一个正斜杠(/). 分隔符可以使任意非字母、数字、反斜杠(\)和空字节之外的非空白ascii字符. 如果分隔符 在表达式中使用, 需要使用反斜线进行转义. 自php 4.0.4开始, 可以使用perl样式的(), {}, []以及<>作为分隔符.
练习:
邮箱地址
用户名可以是字母数字下划线
域名必须有点,最后一段不能带有数字
kunx@kunx.org
kunx-edu@qq.com 不合法的
admin@cc 不合法的
admin@xianrentiao.cn合法的
用户名部分:字母数字下划线
\w+
@
域名部分
\w+\.[a-z]+
参考答案:\w+@(\w+\.)+[a-z]+
匹配IP地址
0-255第一段不能是0
[1-9]
[1-9][0-9]
1[0-9][0-9]
2[0-4][0-9]
25[0-5]
第二段:
[0-9]
[1-9][0-9]
1[0-9][0-9]
2[0-4][0-9]
25[0-5]
第三段和第二段一样