[TOC] 正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。 在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 简单来说正则表达式就是完成字符串的增、删、改、查 ## 应用场合 数据验证、文本替换、内容检索、过滤内容 可以理解为:执行字符串函数无法完成的特殊的匹配、拆分、 替换功能 ## 定界符 正则表达式语句需要由分隔符(定界符)闭合包裹,分隔符可以使任意非 字母数字, 非反斜线, 非空白字符 经常使用的分隔符是正斜线(/), hash符号(#) 以及取反符号(~)。 建议使用//做为定界符,因为和js一致 实例 ~~~ <?php $preg= "/xuebingsi/"; $c = preg_match($preg,"学并思网址xuebingsi.com"); echo $c; ?> ~~~ ## 原子(元字符) 原子是正则表达式中的最小的元素,包括英文、标点符号等 ### 原子构成方式 普通字符是编写正则表达式时最常见的原子了,包括所有的大写和小写字母字符、所有数字等 一些特殊字符和元字符作为原子,统统使用`"\"`转义字符进行转义即可。 在正则表达式中可以直接使用一些系统提供的代表范围的原子,如下面的表格所示: <table class="jbborder"> <tbody> <tr> <td> 代表范围的原子 </td> <td> &nbsp;说明 </td> <td> &nbsp;自定义原子表示法 </td> </tr> <tr> <td> &nbsp;\d </td> <td> &nbsp;表示任意一个十进制的数字 </td> <td> &nbsp;[0-9] </td> </tr> <tr> <td> &nbsp;\D </td> <td> &nbsp;表示任意一个除数字这外的字符 </td> <td> &nbsp;[^0-9] </td> </tr> <tr> <td> &nbsp;\s </td> <td> &nbsp;表示任意一个空白字符,空格、\n\r\t\f </td> <td> &nbsp;[\n\r\t\f ] </td> </tr> <tr> <td> &nbsp;\S </td> <td> &nbsp;表示任意一个非空白 </td> <td> &nbsp;[^\n\r\t\f ] </td> </tr> <tr> <td> &nbsp;\w </td> <td> &nbsp;表示任意一个字 a-zA-Z0-9_ </td> <td> &nbsp;[a-zA-Z0-9_] </td> </tr> <tr> <td> &nbsp;\W </td> <td> &nbsp;表示任意一个非字,除了a-zA-Z0-9_以外的任意一个字符 </td> <td> &nbsp;[^a-zA-Z0-9_] </td> </tr> </tbody> </table> ### 自定义原子表([])作为原子 在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就 是放到[..](方括号)中 <table class="dataintable"> <tbody><tr> <th style="width:20%">表达式</th> <th>描述</th> </tr> <tr> <td><a>[abc]</a></td> <td>查找方括号之间的任何字符。</td> </tr> <tr> <td><a>[^abc]</a></td> <td>查找任何不在方括号之间的字符。</td> </tr> <tr> <td>[0-9]</td> <td>查找任何从 0 至 9 的数字。</td> </tr> <tr> <td>[a-z]</td> <td>查找任何从小写 a 到小写 z 的字符。</td> </tr> <tr> <td>[A-Z]</td> <td>查找任何从大写 A 到大写 Z 的字符。</td> </tr> <tr> <td>[A-z]</td> <td>查找任何从大写 A 到小写 z 的字符。</td> </tr> <tr> <td>[adgk]</td> <td>查找给定集合内的任何字符。</td> </tr> <tr> <td>[^adgk]</td> <td>查找给定集合外的任何字符。</td> </tr> <tr> <td>(red|blue|green)</td> <td>查找任何指定的选项。</td> </tr> <tr> <td>.</td> <td>点在正则中表示除换行符外的任意字符</td> </tr> </tbody></table> **实例** ~~~ <?php $str ="1.jpg@2.jpg@3.jpg#4.jpg"; $preg="/[@#]/"; $c = preg_match($preg,$str); var_dump($c); ?> ~~~ ## 原子组(元字符组) >[success]如果一次要匹配多个元子,可以通过元子组完成 原子组不原子表的差别在于原子组一次匹配多个元子,而原子表则 是匹配成功表中的一个元字符就可以 元字符组用()表示 组号是从 左到右计数的调用时: 这种方式我们叫做反向引用 **实例** ~~~ <?php $str = "学并思官网www.xuebingsiwang.com学并思论坛 http://bbs.xuebingsiwang.com我在学并思的网名叫xuebingsi"; $preg = "/(xuebingsi)wang/is"; $newStr= preg_replace($preg,"<span style='color:#f00'>$1</span>wang",$str); echo $newStr; ?> ~~~ ## 选择修释符 >[success]| 这个符号带表选择修释符,也就是 | 左右两侧有一个匹配到就可以 实例 ~~~ <?php $str = "http://www.baidu.com不新浪网http://www.sina.com"; $preg = "/\.(baidu|sina)\./"; $new_str = preg_replace($preg,'.xuebingsiwang.',$str); ?> ~~~ ## 重复匹配(量词) >[success]如果要重复匹配一些内容时我们要使用重复匹配修饰符,包括以下几种 <table class="dataintable"> <tbody> <tr> <th style="width:20%"> 量词 </th> <th> 描述 </th> </tr> <tr> <td> <a> * </a> </td> <td> 重复零次或更多次 </td> </tr> <tr> <td> <a> + </a> </td> <td> 重复一次或更多次 </td> </tr> <tr> <td> <a> ? </a> </td> <td> 重复零次或一次 </td> </tr> <tr> <td> <a> {n} </a> </td> <td> 重复n次 </td> </tr> <tr> <td> <a> {n,} </a> </td> <td> 重复n次或更多次 </td> </tr> <tr> <td> <a> {n,m} </a> </td> <td> 重复n到m次 </td> </tr> </tbody> </table> 因为正则最小单位是元字符,而我们很少只匹配一个元字符如a、b所以基 本上重复匹配在每条正则语句中都是必用到的内容 ## 禁止重复匹配 >[success]正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过? 进行修饰来禁止重复匹配 <table class="dataintable"> <tbody> <tr> <th style="width:20%"> 量词 </th> <th> 描述 </th> </tr> <tr> <td> <a> *? </a> </td> <td> 重复零次或更多次,但尽可能少重复 </td> </tr> <tr> <td> <a> +? </a> </td> <td> 重复一次或更多次,但尽可能少重复 </td> </tr> <tr> <td> <a> ?? </a> </td> <td> 重复零次或一次,但尽可能少重复 </td> </tr> <tr> <td> <a> {n}? </a> </td> <td> 重复n次,但尽可能少重复 </td> </tr> <tr> <td> <a> {n,}? </a> </td> <td> 重复n次或更多次,但尽可能少重复 </td> </tr> <tr> <td> <a> {n,m}? </a> </td> <td> 重复n到m次,但尽可能少重复 </td> </tr> </tbody> </table> ## 匹配字符边界 >[success]如果想匹配字符的边界,边界包括空格、标点符号、换行等,可以使用正则表达式的匹配字符边界修饰符如下 1. ^匹配字符串的开始 2. $匹配字符串的结束,忽略换行符\n ## 模式修正符 >[success]正则表达式在执行时会按他们的默认执行方式进行,但有时候默认的处理方式总不能满足我们的需求,所以可以使用模式修正符更改默认方式。 1. i不区分大小写字母的匹配 2. s将字符串视为单行,换行符做普通字符看待,使“.” 匹配任何字符 3. 常用正则操作函数 ## preg_match()方法 >[success]执行一个正则表达式匹配 **语法:** `int preg_match ($pattern , $subject) ` ## preg_match_all()方法 >[success]执行一个全局正则表达式匹配 **语法:** `int preg_match_all ($pattern ,$subject [, array &$matches])` matches多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。 ## preg_split()方法 >[success]通过一个正则表达式分隔字符串 **语法:** `array preg_split ( string $pattern , string $subject)` ## preg_replace()方法 >[success]执行一个正则表达式的搜索和替换 **语法:** `mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject)` >[danger] 练习:搞懂邮箱,手机,身份证,网址等等正则,采集拉勾网招聘职位数据