一.正则表达式(regular expression)的概念:
正则表达式就是一套专门用于处理文本的强大工具,可以对进行文本查找,匹配,替换; 正则表达式常用于验证表单提交的内容,比如验证电话号码,Email地址,身份证号码等是否有效; php支持两种风格的正则表达式:Perl风格 Posix 风格 Perl风格 PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。 PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。 在PCRE中,通常将正则表达式 包含在两个反斜线 "/" 之间; 例: "/apple/" 定界符也不仅仅局限于 "/" 。除了字母、数字和斜线 "\"以外的任何字符都可以作为定界符,像" # "、" / "、" !"等都可以的。 Posix 风格 一般而言,实现相同的功能Perl风格的,效率高些,我们一般使用Perl风格的函数! 检查email地址的合法性 1.用字符串查找的方法: function is_email( $email ) { $has_at = strpos ( $email , "@" ); //检查是否 包含@ $has_dot = strpos ( $email , "." ); //检查是否包含. if ( $has_at && $has_dot ){ return true; } else { return false } } echo is_email( "tom@php.net" ); //true echo is_email( "tom@php" ); //false 2.使用正则表达式的方法: function is_email( $email ){ return preg_match( '/^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$/' , $email ); } echo is_email( "tom@php.net" ); //true echo is_email( "tom@php" ); //false 二、Perl 兼容正则表达式函数 1. preg_match() 进行正则表达式匹配 '/hello/' 进行匹配的模式 "hello world" 匹配的字符串 $res 将匹配的结果存放到一个变量里面 preg_match( "/hello/" , "hello world" , $res ); 2. preg_match_all() 进行正则表达式全局匹配 preg_match_all( "/h/" , "hello hello" , $res ); //全匹配 3. preg_replace() 执行正则表达式的搜索和替换 "/hello/" 被匹配字符串的模式 "aaaaa" 用来匹配的字符串 "hello world" 从哪个字符串里面匹配 $res = preg_replace( "/hello/" , "aaaa" , "hello world" ); var_dump( $res ); //aaaa world 4、preg_split() 用正则表达式分割字符串 '/ /' 用于搜索的模式, 字符串形式. 分隔符 $str 用于分割的字符串 $str = 'hypertext hanguage hrogramming' ; $chars = preg_split( '/ /' , $str ); var_dump( $chars ); //array() 5、preg_grep() 返回与模式匹配的数组单元 "/111/" 匹配模式 $array 被匹配的元素 $array = array (3324,111,222,33,44,55); $fl_array = preg_grep( "/111/" , $array ); var_dump( $fl_array ); array (1) { [1]=> string(3) "111" } 三、POSIX 扩展正则表达式函数 1. ereg () 搜索跟正则表达式pattern匹配的一个字符串。区分大小写。搜索到返回true,否则返回false "(hello)" 代表匹配模式 "hello world" 代表匹配字符串 $res 用来存放结果 ereg ( "(hello)" , "hello world" , $res ); var_dump( $res ); 2. eregi () eregi ()函数功能与 ereg ()相同,只是不区分大小写; "(hello)" 代表匹配模式 "hello world" 代表匹配字符串 $res 用来存放结果 eregi ( "(hello)" , "hello world" , $res ); var_dump( $res ); 3. ereg_replace () 搜索跟正则表达式pattern匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方 "(hello)" 代表替换模式 "aaaaa" 替换字符串 "hello world" 被替换的字符串 $res = ereg_replace ( "(hello)" , "aaaa" , "hello world" ); var_dump( $res ); //string(10) "aaaa world" 4. eregi_replace () eregi_replace ()函数功能与 ereg_replace 相同,只是不区分大小写; "(HELLO)" 代表替换模式 "aaaaa" 替换字符串 "hello world" 被替换的字符串 $res = eregi_replace ( "(HELLO)" , "aaaa" , "hello world" ); var_dump( $res ); //string(10) "aaaa world" 四.正则表达式的构成 1.模式 模式是正则表达式最基本的元素,它们是一组描述字符串特征的字符; 模式可以很简单,由普通的字符串组成, 也可以很复杂,包含很多的特殊字符; 验证身份证号码: '/^[1-9][0-9]{14}([0-9]{2}[0-9xX])?$/' 验证手机号码: '/^(13[0-9]|15[0-356]|18[025-9])\d{8}$/' 验证URL地址: "^(http|ftp|https)://(www\.)?[a-zA-Z0-9\-]+\.(com|net|org|cn)$" 2.元字符(特殊字符) * 匹配前面的字符零次或多次 等同于 {0,} preg_match( "/a*/" , "bbbbba" , $res ); //array(1) { [0]=> string(0) "" } + 匹配前面的字符一次或多次 等同于 {1,} preg_match( "/a+/" , 'bbbbbbbbbbaa' , $res ); string(2) "aa" ? 匹配前面的字符零次或一次 等同于 {0,1} preg_match( "/a?/" , "aaaabbbb" , $res ); //"a" | 匹配两个或多个选择 preg_match( "/(h|a)+/" , "dfghsssssasfgdsf" , $res ); ^ 匹配字符串的开始位置 preg_match( "/^hello/" , "hello world" , $res ); $ 匹配字符串结束位置 preg_match( "/^hello world$/" , "hello world" , $res ); \b 匹配单词的边界(如空格、横杠,但不包括下划线) *更简单点说 \b匹配特殊字符* preg_match( "/hello\b/" , "hello-world" , $res ); \B 匹配除单词边界以外的部分 *更简单点说 \B匹配除了特殊字符以外的字符* preg_match( "/\Bc+/" , "aaaa - bbbb - aaac" , $res_test ); [] 匹配方括号中的任一字符 preg_match( "/[abcdf]/" , "aaaa - bbbb - aaac" , $res_test ); [^] 匹配除方括号中的字符外的任何字符 preg_match( "/[^abcdf]/" , "asd" , $res_test ); {m} m 是一个非负整数。匹配确定的 m 次 preg_match( "/\d+/" , "asdasdasdad 3434" , $res ); {m,} m 是一个非负整数。至少匹配m 次 {m,n} 最少匹配 m次且最多匹配 n次 () 表示一个整体 . 匹配除换行之外的任何一个字符 3.预定义元字符 由于某些模式会反复用到,所以可以使用以下预定义类; \d 匹配一个数字;等价于[0-9] preg_match( "/\d+/" , "asdasdasdad 3434" , $res ); \D 匹配除数字以外任何一个字符;等价于[^0-9] preg_match( "/\D+/" , "asdasdasdad 3434" , $res ); \w 匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_] preg_match( "/\w+/" , "asdasdasdad 3434" , $res ); \W 匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_] preg_match( "/\W+/" , "asdasdasdad 3434" , $res ); \s 匹配一个空白字符;等价于[\f\n\r\t\v] preg_match( "/\s+/" , "asdasdasdad 3434" , $res ); \S 匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v] preg_match( "/\S+/" , "asdasdasdad 3434" , $res ); 4.匹配字符的开始和结束 在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果; "^" 置于字符串的开始确保模式匹配出现在字符串首端; "$" 置于字符串的结束,确保模式匹配出现字符串尾端。 如果不加边界限制元字符,将获得更多的匹配结果。 $res = preg_match( "/^hello/" , "hello world" ); var_dump( $res ); $res = preg_match( "/world$/" , "hello world" ); var_dump( $res ); 5.匹配任意字符 用 "." 匹配除换行符外任何一个字符 $res = preg_match( '/./' , "something" ); var_dump( $res ); 通常可以使用 ".*" 组合来匹配除换行符外的任何字符 6.匹配包含某个范围的字符 用 "[start-end]" 匹配包含某个范围的字符 [a-z] 匹配所有的小写字母 [A-Z] 匹配所有的大写字母 [a-zA-Z] 匹配所有的字母 [0-9] 匹配所有的数字 [0-9\.\-] 匹配所有的数字,句号和减号 $res = preg_match( "^[a-z]+$" , "abc" ); var_dump( $res ); 7.重复匹配 正则表达式中有一些用于重复匹配的元字符: "?" 、 "*" 、 "+" 。他们主要的区 别是重复匹配的次数不同。 "?" 匹配前面的字符零次或一次 等同于 {0,1} "*" 匹配前面的字符零次或多次 等同于 {0,} "+" 匹配前面的字符一次或多次 等同于 {1,} "{m}" 匹配确定的 m 次。 m 是一个非负整数; "{m,n}" 最少匹配 m 次且最多匹配 n 次。 m 和 n 均为非负整数,其中m <= n; "{m,}" 至少匹配m 次。 m 是一个非负整数; 8.匹配两个或多个选择 用圆括号 "(word1|word2|…)" 定义包含word1、word2、…的任意字符串的规则 $res = preg_match ( '/^(this|the)/' , 'this island is a beautiful land' ); var_dump( $res ); 9,模式修正符 : 模式修正符在正则表达式定界符之外使用。 i 在和模式进行匹配时不区分大小写 preg_match( "/hello/i" , "HELLO WORLD" , $res ); m 将字符串视为多行 $str = 'bcd abc cba'; preg_match_all( '/^abc/m' , $str , $arr ); print_r( $arr ); s 模式中的圆点元字符 “ . “将匹配所有的字符,包括换行符 $str = 'adsadsa c'; preg_match_all( '/a.*c/s' , $str , $arr ); print_r( $arr ); x 模式中的空白忽略不计,除非已经转义 preg_match_all( "/^ hello /x" , "hello" , $res ); U 取消贪婪匹配 $pattern = '/<b>.*<\/b>/U' ; $string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>' ; preg_match( $pattern , $string , $res ); $str = '21PhP8' ; //不区分大小写 $preg = '/php/i' ; //拿到所有匹配的 $res = preg_match( $preg , $str ); var_dump( $res ); 练习: 1.分析email地址的规则,写一个函数,用于验证email地址; 2.分析电话号码的规则,写一个函数,用于验证电话号码; </b>转载于:https://www.cnblogs.com/jacko/p/4882070.html
