PHP学习笔记1--正则表达式

2012.4.30

正则表达式学习笔记

一、正则表达式概述

  1. 正则表达式就是描述字符串排列的模式的一种自定义语法规则。
  2. 如果可以使用字符串处理函数完成的任务,就不要使用正则表达式处理。字符串处理函数效率较高。正则表达式应用广泛:如提取网站中的新闻内容;对文章的内容搜索,替换;验证用户名,密码格式是否合法;抓取网页中特定格式数据等。
  3. 有一些复杂的操作,只能使用正则表达式完成。
  4. 正则表达式也称为一种模式表达式。
  5. 正则表达式就是构建具有特定规则的模式,与输入的字符信息比较。再进行分割,匹配,查找,替换等工作。

 

二、一个简单的正则表达式例子:

"/\<img\s*src=\".*?\"\/\>/"

由此可见,正则表达式有以下特点:

  • 正则表达式也是一个字符串
  • 由具有特殊意义的字符组成的字符串
  • 具有一定的编写规则,也是一种模式
  • 看作是一种编程语言(是用一些特殊字符按规则编写出一个字符串,形成一种模式---正则表达式)

注意:如果正则表达式,不和函数一起使用,则它就是一个字符串,如果将正则表达式放到某个函数中使用,才能发挥出正则

表达式的作用。

 

三、正则表达式的处理函数

在PHP中给我们提供了两套正则表达式函数:

  • POSIX扩展正则表达式函数,函数以ereg_开头
  • Perl兼容正则表达式函数,函数以preg_开头(效率较高)

两者功能一样,后者效率较高,选用。在JAVA,JS也可应用,只是换一下函数名

 

学习目标:

  1. 正则表达式的模式如何编写
  2. 学习正则表达式的强大处理函数

四、正则表达式语法

正则表达式由一下四种符号构成

"/\<img\s*src=\".*?\"\/\>/iU"

/原子和元字符/模式修正符号    //为定界符(有一些语言是不需要这个定界符号)

  1. 定界符号  / /

    除了字母、数字和正斜线\以外的任何字符都可以为定界符,如| |、{ }、! !没特殊需要,我们都使用正斜线作为正则表达式的定界符号


  2. 原子  img \s

    注意:原子是正则表达式的最基本组成单位,而且必须至少要包含一个原子,只要一个正则表达式可以单独使用的字符,就是原子

    • 原子包含所有打印(键盘上所欲可以再屏幕上输出的字符)和非打印字符(看不到的,如空格)
    • . * + ? { <> 这些有特殊意义的字符,想作为原子使用,使用‘\’转义字符转义

      \. \* \+ \? \m,转义字符可以将有意的字符转成没意义的字符,还可以将没意义的字符转为有意义的字符

    • 在正则表达式中可以直接使用一些代表范围的原子
    1. \d :表示任意一个十进制数字;                   \D:表示任意一个除数字外的字符
    2. \s:表示任意一个空白字符;                        \S:表示任意一个除空白字符外其他字符
    3. \w:表示任意一个字(word)[a-z0-9A-Z]   \W:表示任意一个非字,[^a-z0-9A-Z]
    4. 自己定义一个原子表[],可以匹配方括号的任意原子,[^]表示出了原子表里的其他字符


  3. 元字符 * ? 
元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现

    • * :表示其前的原子可以出现0次、一次或多次(克林闭包)
    • + :表示其前的原子可以出现一次或多次(正闭包)
    • ? :表示其前的原子可以出现0次或一次
    • . : 表示除空格外所有字符,常用法:.*?或.+?:任意多个任意字符
    • ^ :直接在正则表达式的第一个字符出现,表示必须以这个正则表达式开始,区别:/^one/和[^one]
    • $ :直接在正则表达式的最后一个字符出现,表示必须以这个正则表达式结尾
    • | :表示或的关系(它的优先级最低),例:/cat|dog/
    • {} :用于自定义前面出现的原子次数{m}、{m,}、{m,n}
    • \b:表示一个边界
    • \B:表示一个非边界,以上两个可以用于提取is island中的is 和island
    • 重点   ():
  1. ()作为大原子使用,例:/abc+/和/(abc)*/的区别
  2. 改变优先级,例:/ca(t|d)og/
  3. 作为子模式使用
  4. 可以取消子模式,就将()作为大原子或改变优先级使用,只要在其前加?:,即(?:)
  5. 反向引用,可以在模式中直接将子模式中取出来,再作为正则表达式模式的一部分,如果是在正则表达式像替换函数preg_replace函数中,可以将子模式取出,在被替换的字符串中使用。

\1取第一个子模式、  \2取第二个子模式...(注意是单引号还是双引号引起来的正则时的用法)

"\\1" = '\1'

         4. 模式修正符号 i U

"/    /模式修正符"

  1. 就是几个字母
  2. 可以一次使用一个,每一个具有一定的意义,也可以连续使用多个
  3. 是对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展

"/abc/"只能匹配小写字母abc;"/abc/i"可以不区分大小写匹配

有些语言不支持模式修正符号 如javascript

五、正则表达式处理函数

  1. 模式匹配函数:

    preg_match()--匹配一次

    preg_match_all()全匹配

    $pattern="/abc/"; //正则表达式模式 
    $string="1111111abc111111"; //需要匹配的字符串 
    if(preg_match($pattern,$string)){ 
    echo "正则表达式<b>{$pattern}</b> 和字符串<b>{$string}</b> 匹配成功"; 
    }else{ 
    echo "正则表达式<b>{$pattern}</b>和字符串<b>{$string}</b> 匹配失败";
    }
    字符串匹配函数:strstr()、strpos()可以进行简单地匹配与查找;取子串substr()
    • 搜索替换函数str_replace()和preg_replace()
  2. 系统提供的str_replace(),四个参数用法:
    • str_replace(string,string,string)字符串替换字符串
    • str_replace(array,string,string)将数组中的关键字替换为统一的一个字符串
    • str_replace(array,array,string)依次对应替换数组中的元素
    • 第四个参数可选,表示被替换的次数

    为URL地址加上链接的DEMO:

    <?php
    	
    	$str="这是一个网站链接http://www.baidu.com的表达式";
    	$str.="这是一个网站链接http://www.google.com的表达式";
    	$str.="这是一个网站链接ftp://www.baidu.org的表达式";
    	$str.="这是一个网站链接ftps://www.baidu.net的表达式";
    
    	echo setUrl($str);
    
    function setUrl($str){
    
    	$url="/(https?|ftps?):\/\/(www|mail|news)?\.([^\/\.]+)\.(com|org|net)/i";
    	//找出str中所有URL地址,并存入arr数组
    	preg_match_all($url,$str,$arr);
    	//为str中所有URL地址加上链接符
    
    	$str=str_replace($arr[0],array_map("addlink",$arr[0]),$str);
    	
    	return $str;
    }
    function addlink($url){
    	return '<a href="'.$url.'">'.$url.'</a>';
    }
    ?>
    
    
  3.  正则中替换函数preg_replace()
    • 正常使用,将正则匹配到得内容替换
    ex:将$str中的字母都删除
    $str=preg_replace("[a-zA-z]","",$str);
    
    • 将正则中的子模式,可以用到第二个参数中

    ex1:将$str中字母改为红色 

    $str=preg_replace("/([a-z]+)/i",'<font color="red">\1</font>',$str,11);

    ex2:改写1中的setUrl()

    function setUrl($str){
    
    	$url="/(https?|ftps?):\/\/(www|mail|news)?\.([^\/\.]+)\.(com|org|net)/i";
    	//为str中所有URL地址加上链接符
    	$str=preg_replace($url,'<a href="\1://\2.\3.\4">${1}://${2}.${3}.${4}</a>',$str);
    	
    	return $str;
    }
    • 在第二个参数中调用函数

    ex:将$str中字母改为红色并改为大写

    $str=preg_replace("/([a-z]+)/ei",'"<font color=\"red\">"'.'.strtoupper("\1").'.'"</font>"',$str,11);

    注意模式修正符e,可以将第二个参数中使用函数计算
    • 在前两个参数中都使用数组,即将多个正则模式同时替换成多个值

    如论坛发帖的UBB转换为HTML标签

  4. 字符串分割函数explode()和正则分割函数preg_split();
  • 按某个特定字符(串)分割使用explode();
  • 按一个正则模式分割preg_split();
  • 可以用统一函数implode()(别名join())进行字符串组合




      1.  

         

         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值