正则表达式

PHP支持两种风格的正如l表达式语法:POSIX和Perl,这里我们主要使用更简单的POSIX风格

一、基础知识

正则表达式是一种描述一段文本模式的方法,在PHP中,匹配正则表达式更有点像Strstr()匹配,而不像相等比较,因为是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串。例如,字符串”shop”匹配正则表达式“shop”。它也可以匹配正则表达式“h”、“h。”,等。

二、字符集和类

使用字符集可以马上给出比精确匹配功能还要强大的正则表达式。字符集可以用于匹配属于特定类型的任何字符号 事实上它们是一种通配符

  • 可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符。 例如,正则表达式:.at
  • 如果要限定它是a和z之间的字符, 就可以像这样指明:[a-z]at

1.“.”
例如:“.at”可以与 “cat “、“ sat ”和“mat “等进行匹配。通常,这种通配符用于操作系统中的文件名匹配。
2.“[ ]”
任何包含在方括号“[ ]”中的内容都是一个字符类一一 一个被匹配字符所属的字符集合。 请注意, 方括号中的表达式只匹配一个字符,例如:“[aeiou]”表示一个元音集合;而“[a-zA-Z]”表示一个范围(所有大小写字母)。
3.“^”脱字符
例如:“[^a-z]”可以用来匹配任何不在a和z之间的字符。当把脱字符号“^”包括在方括号里面时, 表示否。

三、重复

通常, 我们会希望指明某个字符串或字符类将不止一次地出现。
1.“*”表示这个模式可以被重复0次或更多次
2.“+”则表示这个模式可以被重复1次或更多次。
这两个符号应该放在要作用的表达式的后面。

四、子表达式

通常,将一个表达式分隔为几个子表达式是非常有用的,例如,可以表示“至少这些字符 审中的一个需要精确匹配”。可以使用圆括号来实现,与在数学表达式中的方楼一样。
例如:(very )*large
可以匹配“large”、“verylarge”、“very very large”等。

五、子表达式计数

可以用在花括号“{}”中的数字表达式来指定内容允许重复的次数。可以指定一个确切的重复次数“{3}”(表示重复3次),或者一个重复次数的范围“{2,4}”(表示重复2-4次),或是一 个开底域的重复范围”{ 2 , }”(表示至少要重复两次)。

例如:(very){1,3}
表示匹配“very”“very very”和“very very very”。

六、定位到字符串的开始或末尾

1.“[a-z]”模式将匹配任何包含了小写字母字符的字符息。无论该字符串只有一个字符,或者 在整个更长的字符串中只包含一个匹配的字符.都没有关系。也可以确定一个特定的子表达式是否出现在开始、末尾或在两个位置都出现。当要确定字 符串中只有要找的单词而没有其他单词出现时,它将相当有用。
2.“^”用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始处
3.“$”用于正则表达式的末尾,表示子字符扇必须出现在字符串的末尾。
例如:以下是在字符串开始处匹配bob,
^bob
这个模式将匹配com出现在字符串末尾处的字符串:
com$

最后,这个模式将匹配只包含a到z之间一个字符的字符串:
^[a-z] $ (注意和“[^a-z]”的意思是不同的)

七、分支

可以使用正则表边式中的一条竖线来表示一个选择。 例如, 如果要匹配com、 edu或net,就可以使用如下所示的表达式:
com|edu|net

八、匹配特殊字符

“\”
如果要匹配前面提到过的特殊字符, 例如, . 、 {或者$, 就必须在它们前面加一个反斜杠”\”。 如果要匹配一个反斜杠. 则必须用两个反斜杠“\\”来表示。
注意:在PHP中 , 必须将正则表达式模式包括在一个单引号字符串中。 使用双引号引用的正则表达式将带来一些不必要的复杂性(因为php中的双引号中的内容会经过解释后再输出)。 PHP还使用反斜杠来转义特殊字符一一例如反斜杠。

如果希望在模式中匹配一个反斜杠, 必须使用两个反斜杠来表示它是一个反斜杠字符, 而 不是一个转义字符。

同样, 由于相同的原因, 如果希望在一个双引号引用的PHP字符串中使用反斜杠字符, 必须使用两个反斜杠。 这可能会有些提淆, 这样要求的结果将是表示一个包含了反斜杠字符的正则表达式一个PHP字符串需要4个反斜杠。 PHP解择器将这4个反斜杠解释成2个。 然后, 由正则表达式解释器解析为一个。

$符号也是双引号引用的PHP字符串和正则表达式的特殊字符。要使一个$字符能够在模式中匹配 , 必须用“\\\$”。因为这个字符串被引用在“”中, PHP解释器将其解析为\$,
而则表达式解释器将其解析成一个$字符。

九、特殊字符一览

所有特殊字符的摘要如表1和表2所示。 表1显示了方扩号外特殊字符的意义, 表2显示了当它们用在方括号里面时的意义。

表1,用于方括号外

字符意义
\转义字符
^在字符串开始匹配
$在字符串末尾匹配
.匹配除换行符(\r)之外的字符
;匹配分支的开始(读为或)
(子模式的开始
)子模式的结束
*重复0次或更多次
+重复1次或更多次
{最小/最大量记号的开始
}最小/最大量记号的结束
?标记一个子模式为可选的

表2,用于方括号内

字符意义
\转义字符
^非,仅用在开始位置
-用于指明字符范围
十、在智能表单中的应用

1.在智能表单应用程序中, 正则表达式至少有两种用途。 第一种用途是在顾客的反馈中查找特定的名词。 使用正则表达式, 可以做得更智能一些。 使用一个字符串函数, 如果希望匹配“shop” 、“ customer service” 或 “ retail ”,就必须做3次不同的搜索。 如果使用一个 正则表达式, 就可以同时匹配所有3个, 如下所示:shop|customer service|retail

2.第二个用途是验证程序中用户的电子邮件地址, 这需要通过用正则表达式来对电子邮件地址的标准格式进行编码。 这个格式中包含一些数字或标点符号, 接着是符号 “ @ ”,然后是包括文字或数字和字符组成的字符串, 后面接着是一个 “ . ” (点号), 后面包括文字或数字以连字符组成的字符串, 可能还有更多的点号, 直到字符串结束, 它的编码如下所示:
^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+.[a-zA-Z0-9\-.]+$

子表达式“^[a-zA-Z0-9_\-.]+”表示至少由一个字母、 数字、 下画线、 连字符、 点号或者这些字符组合为开始的字符串。请注意, 当在一个字符类的开始或末尾处使用点号时, 点号将失去其特殊通配符的意义, 只能成为一个点号字符。
符号“@”匹配字符“@”。

而子表达式“[a-zA-Z0-9\-]+”与包含文字数字字符和连字符的主机名匹配。请注意, 我们去除了连字符, 因为它是方括号内的特殊字符。

字符组合 “\ . ” 匹配 “ . ”字符。 我们在字符类外部使用点号, 因此必须对其转义, 使其能够匹配一个点号字符。

子表达式“[a-zA-Z0-9-.]+$”匹配域名的剩下部分, 它包含字母、 数字和连字符, 如果需要还可包含更多的点号直到字符串的末尾。

以下是使用正则表达式的PHP函数
十一、用正则表达式查找子字符串

查找子字符串是正则表达式的主要作用。在PHP中,可以使用的并且用于匹配POSIX风格正则表达式的两个函数是ereg()和eregi()。ereg()函数原型如下所示:
int ereg(string pattern,string search,array[matches]);

该函数搜索字符串search,在pattern中寻找与正则表达式相匹配的字符串。如果发现与它相匹配,则将会存储在数组matches中,每个数组元素对应一个子表达式。

函数eregi()除了不区分大小写外,其他功能和ereg()一样。

十二、用正则表达式替换子字符串

与str_replace()函数一样,也可以使用正则表达式来查找和替换子字符串。
在正则表达式中,可以使用的两个函数是ereg_replace()和eregi_replace(不区分大小写)

十三、使用正则表达式分割字符串

主要使用函数split()实现。这队分割电子邮件地址,域名或日期是非常有用的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值