首页 » 建站技术 » PHP 技术 » 浏览内容

[Monkey's PHP教程] 第六章 PHP的正则表达式


2006-09-07 15:51:25 5,178 0 发表评论 字体: 作者:C.K.
标签: 教程正则表达式

体验版 88 元,个人版 128 元,多用户版 288元个人版160元升级到多用户版。

From:http://lesson.phpso.com/article.php?1457.html

  宏替换系列函数是PHP中的一个重要函数。被广泛地运用到论坛、聊天室等地方。如大家经常在论坛中发帖的时,输入的网址在浏览帖子的时候会直接显示为链接,还有输入的那些表情符号会直接显示为相应的可爱图片。
  在讲解宏替换系列函数之前,我们先引用正则表达式的概念。

第一节 正则表达式

1.什么是正则表达式

  简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。

  在某个Linux网站上面有这样的话:”如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。”
  正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……

2.正则表达式的基本语法

  一个正则表达式,分为三个部分:分隔符,表达式和修饰符。
  分隔符可以是除了特殊字符以外的任何字符(比如”/ !”等等),常用的分隔符是”/”。表达式由一些特殊字符和非特殊的字符串组成,比如”[a-z0-9_-]+@[a-z0-9_-.]+”可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子:

   /hello.+?hello/is

  上面的正则表达式”/”就是分隔符,两个”/”之间的就是表达式,第二个”/”后面的字符串”is”就是修饰符。
  在表达式中如果含有分隔符,那么就需要使用转义符号”\”,比如”/hello.+?\/hello/is”。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要”\”来转义,比如”\d”代表全体数字。

3.正则表达式的特殊字符

  正则表达式中的特殊字符分为元字符、定位字符等等。

元字符:

  大括号:大括号用来精确指定匹配元字符出现的次数,例如”/pre{1,5}/”表示匹配的对象可以是”pre”、”pree”、”preeeee”这样在”pr”后面出现1个到5个”e”的字符串。或者”/pre{,5}/”代表pre出现0此到5次之间。

  加号:”+”字符用来匹配元字符前的字符出现一次或者多次。例如”/ac+/”表示被匹配的对象可以是”act”、”account”、”acccc”等在”a”后面出现一个或者多个”c”的字符串。”+”相当于”{1,}”。

  星号:”*”字符用来匹配元字符前的字符出现零次或者多次。例如”/ac*/”表示被匹配的对象可以是”app”、”acp”、”accp”等在”a”后面出现零个或者多个”c”的字符串。”*”相当于”{0,}”。

  问号:”?”字符用来匹配元字符前的字符出现零次或者1次。例如”/ac?/”表示匹配的对象可以是”a”、”acp”、”acwp”这样在”a”后面出现零个或者1个”c”的字符串。”?”在正则表达式中还有一个非常重要的作用,即”贪婪模式”。

  还有两个很重要的特殊字符就是”[ ]”。他们可以匹配”[]”之中出现过的字符,比如”/[az]/”可以匹配单个字符”a”或者”z”;如果把上面的表达式改成这样”/[a-z]/”,就可以匹配任何单个小写字母,比如”a”、”b”等等。

  如果在”[]”中出现了”^”,代表本表达式不匹配”[]”内出现的字符,比如”/[^a-z]/”不匹配任何小写字母!并且正则表达式给出了几种”[]”的默认值:

   [:alpha:]:匹配任何字母
   [:alnum:]:匹配任何字母和数字
   [:digit:]:匹配任何数字
   [:space:]:匹配空格符
   [:upper:]:匹配任何大写字母
   [:lower:]:匹配任何小写字母
   [:punct:]:匹配任何标点符号
   [:xdigit:]:匹配任何16进制数字

  另外下面这些特殊字符在转义符号”\”转义后代表的含义如下:

   s:匹配单个的空格符
   S:用于匹配除单个空格符之外的所有字符。
   d:用于匹配从0到9的数字,相当于”/[0-9]/”。
   w:用于匹配字母,数字或下划线字符,相当于”/[a-zA-Z0-9_]/”。
   W:用于匹配所有与w不匹配的字符,相当于”/[^a-zA-Z0-9_]/”。
   D:用于匹配任何非10进制的数字字符。

  .:用于匹配除换行符之外的所有字符。

利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如”/\d0000/”利用上面的正则表达式可以匹配万以上,十万以下的整数字符串。

定位字符:

  定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。
   ^:表示匹配的模式出现在匹配对象的开头(和在”[]”里面不同)
   $:表示匹配的模式出现在匹配对象的末尾
   空格:表示匹配的模式出现在开始和结尾的两个边界之一

   ”/^he/”:可以匹配以”he”字符开头的字符串,比如hello、height等等;
   ”/he$/”:可以匹配以”he”字符结尾的字符串即she等;
   ”/ he/”:空格开头,和^的作用一样,匹配以he开头的字符串;
   ”/he /”:空格结束,和$的作用一样,匹配以he结尾的字符串;
   ”/^he$/”:表示只和字符串”he”匹配。

括号:

  正则表达式除了可以用户匹配,还可以用括号”()”来记录需要的信息,储存起来,给后面的表达式读取。比如:
   /^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/

  就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为username@server.com之类的),在后面如果想要读取记录下来的字符串,只是需要用”转义符+记录的次序”来读取。比如”\1″就相当于第一个”[a-zA-Z0-9_-]+”,”\2″相当于第二个([a-zA-Z0-9_-]+),”\3″就是第三个(.[a-zA-Z0-9_-])。但是在PHP中,”\”是一个特殊的字符,需要转义,所以到了PHP的表达式中就应该写成”\\1″,”\\0” 表示全部字符串。

其他特殊符号:

  ”|”:或符号”|”和PHP里面的或一样,不过是一个”|”,而不是PHP的两个”||”!意思就是可以是某个字符或者另一个字符串,比如”/abcd|dcba/”可能匹配”abcd”或者”dcba”。

4.贪婪模式

  假如有abbbbbbbbbbbbbbbbb

使用贪婪模式的表达式如下:
/a.+?b/
匹配到abb

不使用贪婪模式的如下:
/a.+b/
匹配到abbbbbbbbbbbbbbbbb

5.修饰符

常用的修饰符如下:

   i :正则将会取消大小写敏感性,即”a”和”A” 是一样的。
   s:默认的”.”代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
   e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。

    网站统计 Statistics

    • 创建时间: 2005年1月3日 距今4973 天
    • 日志总数: 2461
    • 评论总数: 630
    • 标签总数: 654
    • 链接总数: 273
    • 最后更新: 2017-7-1 18:16:33
    • 您是本站第 13808106 位访客

    广告区 Guǎng Gào