RegEx.php
来源:原创
时间:2016-07-23
作者:脚本小站
分类:代码笔记
<?php /* 速查: \d 数字 0-9 (digit) \s 任一空格 \n\r\t\f (space) \w 表示一个字 a-zA-Z0-9_ (word) . 表示任一字符(除换行符) * 0或多次 + 1或多次 i 不区分大小写 U 取消贪婪模式 () 作用: 1.大原子 2.改变优先级 3.子模式(在括号中的最前面加?:取消子模式) 在PHP中给我们提供两套正则表达式函数库 POSIX 扩展正则表达式函数(ereg_) Perl 兼容正则表达式函数(preg_) 注意:推荐使用Perl 兼容正则表达式函数库(只学这一种) //================================================================== //--------------------一、正则表达式的模式如何编写---------------- //------------------------1. 定界符号 // -------------------------- 除了字母、数字和正斜线\ 以外的任何字符都可以为定界符号 | | / / { } ! ! 通常使用正斜线作“//”为正则表达式的定界符号 //------------------------------------------------------------ //------------------------2. 原子 img \s . ----------------- 注意:原子是正则表达式的最基本组成单位,且必须至少要包含一个原子 原子:一个正则表达式可以单独使用的字符 1. 原子包括所有打印(所有可以在屏幕上输出的字符串)和非打印 字符(看不到的) 2. " \ "转义字符可将有意的字符转成没意义的字符, 还可将没意义的字符转为有意义的字符 如:\. \* \+ \? \( \<\> 3. 在正则表达式中可以直接使用一些代表范围的原子 \d 一个十进制的数字 [0-9] \D 一个除数字这外的字符 [^0-9] \s 一个空白字符,空格、\n\r\t\f [\n\r\t\f] \S 一个非空白 [^\n\r\t\f] \w 一个字 a-zA-Z0-9_ [a-zA-Z_] \W 除了a-zA-Z0-9_ 以外的任意一个字符 [^a-zA-Z0-9_] \b 单词边界 \B 非单词边界 4. 自己定义一个原子表[], 可以匹配方括号中的任何一个原子 [a-z5-8] [*+.](括号中特殊字符可转意可不转意,最好转意) [^a-z] ^ 表示取反,就是除了原子表中的原子,都可以表示 ^ 必须在 [] 内的第一个字符处出现 //------------------------------------------------------------ //--------------------------3. 元字符 * ? ------------------- 元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现 表示其前的面原子可以出现的次数: * 0次和任意次 {0,} + 1次以上 {1,} ? 0次或1次 {0,1} {} 用于自己定义前面原子出现的次数: {m} m次(精确的) {m,n} m到n次,包括m和n {m,} m到无限 . 表示任意 一个 字符(除换行符) ^ 必须以某个内容开始(^ 放在表达式开头) $ 必须以某个内容结束($ 放在表达式结尾) | 表或的关系 优先级最低 \b : 表示一个边界 \B : 表示一个非边界 括号 () 一、将正则括起表示大原子 二、加上括号可以提高优先级别 三、作为子模式使用: 全部匹配作为一个大模式,放到数组的第一个元素中。 每个 () 匹配的是一个子模式按顺序放到数组的其它元素中去。 四、 (?: ) 可以取消子模式,括号只改变优先级 “?:”放在最前面 五、反向引用,取出子模式,作为表达式模式的一部分,如果是在正 则表达式像替换函数 preg_replace 函数中,可以将子模式取出,在 被替换的字符串中使用 \1 取第一个子模式 \2 取第二个子模式 .... "\\1" '\1' 注意是单引号还是双引号引起来的正则 示例: $patterns = "/\<a\s*href=\'(.*\.html).*\>(.*)\<\/a\>/iU"; $replacements = "<a href=\"http://www.dy2018.com\\1\">\\2</a><br>"; $string = file_get_contents("http://www.dy2018.com"); preg_match_all($patterns,$string,$arr); $string = implode('',$arr[0]); echo preg_replace($patterns,$replacements,$string); ${1} ${2} 不可在本身使用 \* \+ \. \? 优先级 1. \ 2. () (?:) [] 3. * + ? {} 4. ^ $ \b 5. | //------------------------------------------------------------------- //-----------------------4. 模式修正符号 i u------------------------ 模式修正符作用: "/ /模式修正符" 1. 就是几个字母 2. 可以一次使用一个,每一个具一定的意义, 也可以连续使用多个 3. 是对整个正则表达式调优使用, 也可以说是对正则表达式功能的扩展 "/abc/" 只能匹配小写字母 abc "/abc/i" 可以不区分大小写匹配 ABC abc Abc ABc AbC i 不区分大小写 m 将字符串视为一行 (在使用 ^ 或 $ 时,任何一行都可以以该正则开始或结束) s 元字符中的"."默认不能表示换行符号将字符串视为单行。使用后则也可以表示换行符 x 空白忽略不计 e 在使用 preg_replace 时,内部可以使用函数 如: preg_replace("/[a-z]/e",'strtoupper("\1")',$str,11); A : 同^ D : 同$ U : 取消贪婪模式。 取消贪婪模式(两种方法勿同时使用,否则作用抵消) 一种使用模式修正符号 U 一种是使用?完成 .*? .+? "/\<img\s*src=\".*?\"\/\>/iU" "#\<img\s*src=\".*?\"\/\>#iU" /原子和元字符/模式修正符号 / 为定界符号 (有一些语言是不需要这个定界符号) 有些语言中不支持模式修正符号如:javascript */ //======================================================================= //--------------------二、学习正则表达式的强大处理函数----------------- // 1. 字符串的匹配与查找 str_replace( 要替换的值, 替换为的值, 被搜索的字符串, [ 替换次数]) str_replace(string, string, string) str_replace(array, string, string) str_replace(array, array, string) str_replace() str_ireplace() //不区分大小写 //----------------------------------------------------------------------- //----------------------------------------------------------------------- preg_match_all //"匹配全局 preg_match_all(正则,字符串,数组,PREG_PATTERN_ORDER);" //"模式 PREG_PATTERN_ORDER PREG_SET_ORDER " preg_match //"匹配 preg_match(正则,字符串,数组:匹配出的信息);" preg_replace //"替换 preg_replace(正则,要替换为的字符串,要匹配的字符串,[要替换的次数]);" preg_replace_callback//用回调函数执行正则表达式的搜索和替换 preg_split //"分割 preg_split(正则:要分割的各种符号,要分割的字符串)" preg_quote //"preg_quote(要转义的字符串,[分隔符]) 转义正则表达式字符,自动将正则符号加转意字符" preg_grep //"返回与模式匹配的数组单元 preg_grep(正则,数组)" //=============================替换================================== //------------------------preg_replace 例---------------------------- //字符串 $string = "Name: {Name}< br>\nEmail: {Email}< br>\nAddress: {Address}< br>\n"; //模式 $patterns =array( "/{Address}/", "/{Name}/", "/{Email}/" ); //替换字串 $replacements = array ( "No.5, Wilson St., New York, U.S.A", "Thomas Ching", "tom@emailaddress.com", ); //输出模式替换结果 echo preg_replace($patterns, $replacements, $string); //=======================抓取网页链接并替换================== //--------------------------------方法1----------------------- $patterns="/\<a\s*href=\'(.*\.html).*\>(.*)\<\/a\>/iU"; $replacements="<a href=\"http://www.dy2018.com\\1\">\\2</a><br>"; $string=file_get_contents("http://www.dy2018.com"); preg_match_all($patterns,$string,$arr); $string=implode('',$arr[0]); echo preg_replace($patterns,$replacements,$string); //------------------------------------------------------------ //-------------------------------方法2------------------------ $patterns="/\<a\s*href=\'(.*\.html).*\>(.*)\<\/a\>/iU"; $string=file_get_contents("http://www.dy2018.com"); preg_match_all($patterns,$string,$arr); for($i=0;$i<=330;$i++){ echo "<a href=\"http://www.dy2018.com".$arr[1][$i]."\">".$arr[2][$i]."</a><br>"; } //------------------------------------------------------------ //--------------------------抓取汉字-------------------------- $str="vbfyh汉字汉字vfj"; //GBK/GB2312编码:[x80-xff>] 或 [xa1-xff] preg_match_all("/[^xa1-xff]{2,}/", $str, $arr); //UTF-8编码:[x{4e00}-x{9fa5}] preg_match_all("/[^x4e00-x9fa5]{2,}/", $str, $arr); //============================================================ //------------------------匹配微博评论----------------------- $string = 'bgjf@dbngj@gtur@c你b_好<img src="vnfjgn.jpg">@雅蠛蝶'; /* 匹配字母、下划线、还有utf8的中文 */ $regEx = "/@[a-zA-Z0-9_\x{4e00}-\x{9fa5}]+/u"; preg_match_all($regEx,$string,$arr); //============================================================ //------------------正则替换是有先后顺序的------------------- $string = 'ThinkPHP ,,,框和架 limit() 方法的或用法详解'; $string = trim($string); // 正则替换是有先后顺序的,数组的第一个先替换 $reg = array( "/\s+/", '/,{2,}/', '/的/', ); $replace = array( ',', ',', ',' ); echo preg_replace($reg,$replace,$string); //============================================================ //------------------------------------------------------------