php 正则表达式
看正则就是一种享受
常见的元字符
字符 | 描述 |
---|---|
. | 匹配除\n之外的任何单个字符。 |
[abcde] | 匹配abcde之中的任一字符。 |
[a-h] | 匹配a到h之间的任一字符。 |
[^fgw] | 不与fgw之中的任一字符匹配。 |
\w | 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。 |
\W | 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\u4e00-\u9fa5 | 匹配任意单个汉字(这里用的是unicode编码表示汉字,具体看编码集) |
正则表达式限定符(限定它前面的一个单元 元字符
或 ()子表达式
)
字符 | 描述 |
---|---|
* | 匹配 0 到 多 个元字符。等价于{0,}。 |
? | 匹配 0 到 1 个元字符。等价于{0,1}。 |
匹配 n 个元字符。 | |
匹配 至少 n 个元字符。 | |
匹配 n 到 m 个元字符。 | |
+ | 匹配至少 1 个元字符。等价于{1,}。 |
\b | 匹配一个单词边界。 |
正则表达式位置和顺序
字符 | 描述 |
---|---|
^ | 字符串必须以指定的字符开始。 |
$ | 字符串必须以指定的字符结束。 |
正则表达式多选结构
字符 | 描述 |
---|---|
| | 选择字符表示或的意思。如ooa|b|c,表示ooa或者是b或者是c的意思,注意他的边界。 |
正则表达式后向引用
使用小括号指定一个子表达式(分组)后,匹配这个子表达式的文本可以被捕获,从来在表式或其它程序中作进一步处理,默认情况下,每个分组会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为1,第二个为2。
\b(\w+)\b\s+\1\b
where where go, tom tom happy
(?:\w+) 匹配但不获取匹配结果,不进行存储供以后使用
正则表达式环视(零宽断言)
-
环视不匹配任何字符,只匹配文本中的特定位置。环视不占用字符
-
顺序环视
(?=exp)
位置的后面能匹配exp。例如:(?=\d)
当前位置右边是数字。(?!exp)
位置的后面不能匹配exp。例如:(?!\d)
当前位置右边不是数字。
-
逆序环视
(?<=exp)
位置的前面能匹配exp。例如:(?<=\d)
当前位置左边是数字。(?<!exp)
位置的前面不能匹配exp。例如:(?<!\d)
当前位置左边不是数字。
例:为数值添加逗号
3345678986 3,345,678,986 # 分析:我们需要找到一个位置,并将‘位置’替换为‘,’ # 条件:左边必须有数字 右边的数字是3的倍数 $string = '3345678986'; $pattern = '/(?<=\d)(?=(\d{3})+$)/'; $replacement = ','; echo preg_replace($pattern, $replacement, $string);
-
正则表达式贪婪与懒惰(匹配优先与忽略优先)
- 重复的量词(例:+,*,{3,12} 等)通常的行为是匹配尽可能多的字符
aabab a.*b
匹配结果aabab
贪婪匹配aabab a.*?b
匹配结果aab ab
匹配成功的前提下使用最少的重复 懒惰匹配
正则引擎
- DFA 表达式主导 容易操纵 程序员偏爱 支持忽略优先量词和分组捕获 awk,egrep,flex,lex,mysql,procmail
- NFA 文本主导 搜索更快 不支持忽略优先量词和分组捕获 java,ergp,less,more,C#,pcre,library,perl,php,python,ruby,sed,vi
PHP常用的模式修饰符
字符 | 描述 |
---|---|
i | 大小写不敏感匹配。 |
m | 增强的行锚点模式。 |
x | 空白和#注释将被忽略。 |
s | 点号元字符匹配所有字符,包含换行符。 |
e | 将替换后的字符串作为php代码评估执行。 |
pcre的分隔符
分隔符可以使用任意非字母数字,非反斜线,非空白字符
在线测试网站
好用的软件 regexbuddy
常用的例子
# 整数或小数
/^\d+(?=\.{0,1}\d+$|$)/
# 过滤网页的js标记及内容全去掉
/<[^>].*?>.*?<\/>/si
# 匹配中文字符的正则表达式
/[\u4e00-\u9fa5]/
# 中文、英文、数字但不包括下划线等符号
/^[\u4E00-\u9FA5A-Za-z0-9]+$/
# 字母开头,允许5-16字节,允许字母数字下划线
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/
# 匹配双字节字符(包括汉字在内)
/[^\x00-\xff]/
# 匹配空行的正则表达式
/\n[\s| ]*\r/
# 匹配HTML标记的正则表达式
/<(.*)>.*<\/\1>|<(.*) \/>/
# 匹配首尾空格的正则表达式
/(^\s*)|(\s*$)/
# 匹配IP地址的正则表达式
/(\d+)\.(\d+)\.(\d+)\.(\d+)/g
# 匹配Email地址的正则表达式
/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
# 手机号(中国)
/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/
# 验证账号,字母开头,允许 5-16字节,允许字母数字下划线
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/
# 验证账号,不能为空,不能有空格,只能是英文字母
/^\S+[a-z A-Z]$/
# 验证账号,不能有空格,不能非数字
/^\d+$/
# 验证用户密码,以字母开头,长度在 6-18 之间
/^[a-zA-Z]\w{5,17}$/
# 验证是否含有 ^%&',;=?$\ 等字符
/[^%&',;=?$\x22]+/
# 匹配Email地址
/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
# 匹配腾讯QQ号
/[1-9][0-9]{4,}/
# 匹配日期,只能是 2004-10-22 格式
/^\d{4}\-\d{1,2}-\d{1,2}$/
# 匹配国内电话号码
/^\d{3}-\d{8}|\d{4}-\d{7,8}$/
# 匹配中国邮政编码
/^[1-9]\d{5}(?!\d)$/
# 匹配身份证
/\d{14}(\d{4}|(\d{3}[xX])|\d{1})/
# 不能为空且二十字节以上
/^[\s|\S]{20,}$/
# 匹配网址 URL
/[a-zA-z]+://[^\s]*/
# 匹配 IP 地址
/((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)/
# 匹配完整域名
/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/