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})+\.?/

posted on 2019-11-21 18:40  何苦->  阅读(157)  评论(0编辑  收藏  举报

导航