php中使用正则表达式,PHP中使用正则表达式(一)

1. 正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

------ From Wikipedia

正则表达式其实就是一组字符串,它是由字母、数字、符号组成按照一定的规则组成的。可以把正则表达式理解为一种“模式”,一般当需要对字符串进行处理,而自带的函数(例如PHP自带的字符串处理函数)满足不了要求的时候,就会选择使用正则表达式。使用正则表达式可以对指定的字符串进行查找、替换、分割等操作。

PHP 5.3.0之前支持两种类型的正则表达式:

POSIX正则表达式

PERL正则表达式

POSIX正则表达式和PERL正则表达式的语法几乎是相同的,它们之间的区别主要在于以下两点:

1. 定界符

POSIX正则表达式没有定界符,PERL正则表达式有定界符。

PERL正则表达式: /\d{4}\W\d{2}\W\d{2}/

POSIX正则表达式: \d{4}\W\d{2}\W\d{2}

以上的正则表达式都可以匹配类似于“2016-08-19”这样的时间格式。在PERL正则表达式中开始和结束位置上的两个字符"/",就是定界符。

2. 修正符

POSIX正则表达式没有修正符,PERL正则表达式有修正符。

PERL正则表达式: /bob/i

POSIX正则表达式: bob

以上的正则表达式用来匹配特定的单词,其中在PERL正则表达式中最后一个字符"i"就是修正符,它是对正则表达式的扩展,"i"表示忽略大小写。也就是说PERL的正则表达式除了可以匹配含有bob的字符串,还可以匹配含有"Bob","BOB"等所有三个字母大小写放在一起的组合的字符串。

但是PHP在5.3.0以后就不再支持POSIX风格的正则表达式,所以这里就介绍PERL正则表达式。

2.PERL正则表达式语法

一个PERL正则表达式可以由定界符、用于匹配的元素(原子)、元字符、模式修正符组成。

2.1 定界符

/\d{4}\W\d{2}\W\d{2}/

上面的正则表达式开始和结束位置上面两个"/"就是定界符,定界符是正则表达式的边界。规定除了数字、字母、反斜杠(\)不能用做定界符,其余的符号都可以用做定界符。常用的定界符就是"/"、"#"。

**2.2 用于匹配的元素(原子)**

>```

/a{2}\W\d{4}[h-z]/

顾名思义,用于匹配的元素是正则表达式中最基本的成员,它就是被拿来和目标字符串进行匹配的东西。在上面的正则表达式中"a{2}"、"\W"、"\d{4}"、"[h-z]"都是用于匹配的元素。在正则表达式中以下元素可以用做匹配的元素:

(1). 所有的数字、字母。 例如:1、2、3、a、b等。

(2). 被元字符修饰的数字或字母。例如:a{2}、[h-z]等。

(3). 元字符也可以用作匹配的字符,但是需要用转义字符("")进行处理。例如:\* 、\+ 分别用来匹配*和+。

(4). 许多普通的字母被转以字符修饰后表示一些特殊的含义也可以用作匹配的元素。例如:\w 表示匹配任意一个字,如字母、数字、下划线。\W表示匹配任意一个非字。

2.3 元字符

元字符被用来修饰用于匹配的元素。不可以单独出现!下面对常用的元字符进行总结。

(1) * 表示它前面的元素可以出现0次至多次。

(2) + 表示它前面的元素可以出现1次或者多次。

(3) ? 表示它前面的元素可以出现0次或者1次。

(4) . 可以匹配除换行符外任意一个字符,它和*组合可以匹配任意的字符或者字符串。

(5) [] 表示匹配"[]"内表示的范围的任意一个字符、数字:

/[a-z]/ 可以匹配任意一个处于a和z之间的字母

(6) {} 表示它前面的字符可以出现的次数:

/a{m}/ 表示a可以出现m次

/a{m,n}/ 表示a至少出现m次,至多出现n次(n>m)

/a{m,}/ 表示a至少出现m次

*可以表示为{0,} +可以表示为{1,} ?可以表示为{0,1}

(7) ^ 在一个正则表达式开始的位置出现,表示字符串必须以这个正则表达式开始:

/^abc/ 匹配所有以abc开始的字符串

^出现在[]里面表示匹配[]表示的范围之外的元素:

/[^a-z]/ 匹配在a到z范围之外的所有字符

(8) $ 在一个正则表达式结束的位置出现,表示字符串必须以这个正则表达式结束:

/abc$/ 匹配所有以abc结束的字符串

(9) | 表示或的关系

(abc|abd) 匹配字符串abc或者abd

(10) ( ) 括号, 作用如下:

(i) 把单个的元素用括号括起来作为一个整体使用

(ii) 改变优先级:加上括号可以提高优先级。

(iii) 作为子模式使用 :

在下面所说的 preg_match 方法中,结果会被赋值到 $arr 变量中,先匹配外层模式,再匹配内层模式。

$pattern="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"; //正则表达式模式

$string="today is 2010/09/15 15:35:28 pm..."; //需要和上面模式字符串进行匹配的变量字符串

if(preg_match($pattern, $string, $arr)){

print_r($arr);

}

结果

Array

(

[0] => 2010/09/15 15:35:28 pm

[1] => 2010/09/15

[2] => /

[3] => 15:35:28

[4] => :

)

当我们在一个正则表达式中需要重复用到一个子模式时,可以进行反向引用,直接在模式中把子模式提取出来然后再进行使用。\1 取第一个子模式、 \2取第二个子模式,但是注意是单引号还是双引号引起来的正则表达式,因为在双引号引起来的正则表达式中,它是可以解释转义字符的,所以 \1 必须要写成 \1。 在单引号引起来的正则表达式中,则不会出现这种情况,\1 仍然可以写成 \1:

$pattern1="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"

$pattern2="/(\d{4}(\W)\d{2}\\1\d{2})\s+(\d{2}(\W)\d{2}\\2\d{2})\s+(?:am|pm)/"

上面的两个正则表达式表示的是一个意思。(\W)作为第一个子模式被使用过了,所以就被存储起来,\\1就表示它。同理\\2也可以这么理解

当我们不想把括号内的整体作为一个在匹配的时候作为一个子模式,可以在模式前面加上"?:"即可。上面的正则表达式中(?:am|pm)在匹配时并没有作为子模式进行匹配。

元字符的优先级:

1)\ 转义符最高

2)(),(?:) 括号其次

3)* + ? {}

4)^ $ \b

5)|

2.4 模式修正符

模式修正符就是几个特殊字母,放在正则表达式的结尾。它的作用就是用来扩展正则表达式的功能,可以单独使用也可以几个放在一起使用。

常见的模式修正符:

i 表示在用模式进行匹配的时候不区分大小写

m 表示把要匹配的目标字符串的每一行都当作一个整体的字符串来进行匹配,这个修正符主要是对元字符^和$产生影响。例如:

str = "abc

efg

23";

pattern = "/^efg/m"

使用上面的正则表达式来匹配str字符串就会匹配到efg。但是如果正则表达式的结尾不加上m就会匹配不到任何字符。

x 表示忽略正则表达式中的空格。例如:

pattern = "/a b c/";

str = "abc";

使用上面的正则表达式依然可以匹配到str。

e 正则表达式必须使用在 preg_replace 函数中使用

A 表示必须以正则表达式开头,相当于加上^

Z 表示必须以正则表达式结尾,相当于加上$

U 表示取消贪婪模式(表示在成功匹配的前提下尽可能多的匹配)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP正则表达式可以使用`preg_match()`、`preg_match_all()`、`preg_replace()`和`preg_split()`函数来操作。 - `preg_match(pattern, subject, matches)`函数用于在字符串搜索匹配指定模式的第一个出现的位置。如果找到匹配,返回值为1,否则为0。`pattern`是正则表达式模式,`subject`是要搜索的字符串,`matches`是可选的参数,用于存储匹配的结果。 - `preg_match_all(pattern, subject, matches)`函数用于在字符串搜索匹配指定模式的所有出现位置。如果找到匹配,返回值为匹配的次数。`pattern`、`subject`和`matches`参数的含义与`preg_match()`函数相同。 - `preg_replace(pattern, replacement, subject)`函数用于在字符串搜索匹配指定模式的内容,并将其替换为指定的内容。`pattern`是正则表达式模式,`replacement`是要替换的内容,`subject`是要搜索和替换的字符串。 - `preg_split(pattern, subject)`函数用于根据指定的模式分割字符串,并返回一个数组。`pattern`是正则表达式模式,`subject`是要分割的字符串。 示例: ```php $pattern = "/\b\d{3}-\d{3}-\d{4}\b/"; // 匹配电话号码格式 xxx-xxx-xxxx $subject = "联系我的电话号码是 123-456-7890"; if (preg_match($pattern, $subject)) { echo "找到匹配的电话号码!"; } else { echo "未找到匹配的电话号码!"; } ``` 以上是PHP正则表达式的简单介绍,你可以根据具体需求参考PHP官方文档关于正则表达式的更多用法和函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值