zoukankan      html  css  js  c++  java
  • php正则表达式学习(附各种案例)

    正则表达式是用来描述字符排列模式的一种语法规则

    作用:用来进行字符串的模式分割,匹配,查找,替换

    边界符:一般采用”/”来做它的边界符

    原子:

    原子包含普通字符,如英文字符,数字,例如a-z,A-Z,0-9

    特殊字符:()?^$\.+|   这些需要用”\”转义
    “\”是转义字符,如果你的原子里有(*.+\^),请使用\进行转义,如果你要匹配\,请使用\\,同理也可以用\+来表示加号

    “\”也有一些特殊功能,比如它加上一些字表,就会表式某种意义,如下:
    \d 匹配一个数字0-9  相当于[0-9]
    \D 匹配除数字以外的任何一个字符 相当于[^0-9]
    \w 匹配一个纯字母,数字及下划线_  相当于[0-9a-zA-Z_]
    \W 匹配除了(纯字母,数字及下划线_)以外的   相当于[^0-9a-zA-Z_]
    \s 匹配一个空白字符(比如空格,\f换页字符 \n换行字符  \r回车字符 \t制表符 \v垂直字表符) 相当于[\f\n\r\t\v]
    \S 匹配除空白字符以外的其它字符 相当于[^\f\n\r\t\v]

    [0-9] 匹配任何一个数字,相当于\d
    [a-z]匹配任何一个小写字母
    [ab]匹配字母a,或者字母b
    [A-Z]匹配大写字母
    [^a]这里面的^表示取反,在这里匹配除字母a以外的任何字符
    [0-9a-zA-Z]匹配任何数字及字母
    [^0-9]匹配除数字外的任何其它字符

    一个正则表达式,至少包含一个原子
    元字符:(有特殊功能用途的字符)*+?.|$

    *   0次或者一次,或者多次匹配其前的原子
    +   一次或者多次匹配其前的原子,至少一次
    ?   0次或一次匹配其前的原子
    .   匹配除换行符外任何一个字符 linux下相当于[^\n] windows下相当于[^\n\r]
    .*  比如/a.*b/这个正则,表示匹配套a和b之间不能有换行的任意多个字符
    |   或操作符,匹配二个或多个选择,它的优先级是正则里最低的
    /one|two|three/  匹配one,或者two,或者three这样的三个词
    ^   匹配字符串串首的原子 /^abc/这个表示匹配以abc开头的字符串
    $   匹配字符串串尾 /abc$/匹配以abc结尾的字符串
    \b  匹配单词的边界 如/\bis\b/ 匹配this is sheep这样里的is,因为这里的is二边都有边界
    \B  匹配非单词的边界
    {m} 表示其前的原子恰好出现m次
    {m,n} 表示其前的原子至少出现m次,至多出现n次
    {m,}表示其前的原子出现不少于m次
    {,n}表示其前的原子至多不能超过n次
    () 整体表示一个原子 比如(abc)这样,abc代表一个原子
    比如/(dog)+/匹配字符串dogdogdog,因为dog整体代表一个原子
    正则表达式的执行顺序是从左到右执行的
    元字符的优先级
    优先级一:()
    优先级二: 重复配配 ?*+{}
    优先级三:边界限制^$\b\B
    优先级四:模式选择符 |
    模式修正字符:(i,U,s,x)

    模式修正符一般标记在整个模式之外,如/abc/i,这里的i就是模式修正符

    i   如果设置此修正符,同时匹配模式里的大写和小写 如/abc/i 匹配了aBc
    m   表示匹配多行,字符串里只要有一行能匹配上就算成功
    如 /^abc/m 匹配多行里以abc开头的,如可以匹配字符串
    babcfdfd\nabcfdfd
    这里\n表示换行,后面有个abc开头的,因为有了m修正符,所以能配匹上

    s   与m相反,表示将字符串视为单行,换行符\n作为普通字符
    比如/pr.y/s 可以匹配pr\ny这个字符,虽然.不能匹配换行符,但加上s把\n变成了普通字符
    x   忽略模式里的空白不计,比如/i love you/x 其实相当于是/iloveyou/
    A   强制从目标字符串开头开始匹配,   /abc/A 相当于/^abc/
    D   /abc$/D 表示匹配以abc结尾,后面仍可以有换行,D表示忽略最后的换行
    U   匹配最近的一个符符串

    例:字符串  “<b>hello</b>abcdefg<hr>aaaaa”
    模式: /<.+>/  与之匹配,匹配出来的字符串会是<b>hello</b>abcdefg<hr> 因为它没有选择最近的>
    模式: /<.+>/U 与之区配,匹配出来的字符串是<b>,加了U表示匹配最近的能匹配成功的字符串

    php中的正则替换函数

    preg_replace

    例:

    $str=”thi6s i3s a de9mo”;
    echo preg_replace(“/\d/”,”MM”,$str);
    上例会将$str里的数字内容替替换成MM

    $urlstr=” this is http://www.baidu.com,不是http://www.163.com“;
    echo preg_replace(“/(http:\/\/www\.\w+\.com)/iU”,”<a href=\\1>\\1</a>”,$urlstr);
    上例会将字符串自动加上链接
    ()里的内容,会存进\\1,如果()出现多次,会以次存为\\1,\\2,\\3,所以会将匹配上的内容通过\\1进行替换

    $str=" 名字:{name}<br>email:{email}<br>age:{age}";
    $patterns=array("/{name}/","/{email}/","/{age}/");
    $replacements=array("张三","zhangsan@gmail.com","27");
    echo preg_replace($patterns,$replacements,$str);

    上例将会遍历数组依次正则替换,输出内容为:
    名字:张三<br>email:zhangsan@gmail.com<br>age:27
    preg_split
    使用正则表达式来分隔字符串,返回一个数组

    举例:
    比如要计算一篇文章里有多少句话

    $str="一大段的文章内容";
    $arr=preg_split("/[,。!、]/",$str);
    echo count($arr);

    正则表达式的实例应用:

    ubb代码的转换安例:

    $str="[b]abcd[/b][u]abc[/u][code]xxxx[/code]
    
    [align=left]abc[/align][url=http://www.baidu.com]百度[/url]";
    echo conubb($str);
    function conubb($str){
    $pattern=array(
     "/\[b\](.*)\[\/b\]/is",
     "/\[i\](.*)\[\/i\]/is",
     "/\[u\](.*)\[\/u\]/is",
     "/\[font=([,\w\x7f-\xff]*)\](.*)\[\/font\]/is"
     );
    //\x7f-\xff 表示任意一个中文字符
    $replacement=array(
     "<b>\\1</b>",
     "<i>\\1</i>",
     "<u>\\1</u>",
     "<font face='\\1'>\\2</font>
     );
    
    $str=preg_replace($pattern,$replacement,$str);
    return $str;
    
    }
  • 相关阅读:
    浙江省CIO协会钱塘江论坛近日在网易云创沙龙宣布成立
    用Python解析XMind
    Flask写web时cookie的处理
    一篇文章看懂Facebook和新浪微博的智能FEED
    改进网易云音乐的“音乐社交”构想
    移动端爬虫工具与方法介绍
    用供应链管理思路降低教培产品成本
    【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)
    网易严选的wkwebview测试之路
    linux多进程之间的文件锁
  • 原文地址:https://www.cnblogs.com/lsmsky/p/2355818.html
Copyright © 2011-2022 走看看