php正则表达式基本


一.正则表达式的组成

1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~

2.表达式:由一些特殊字符和非特殊字符组成.

3.修饰符:用于开启或关闭某种功能/模式

.元字符

常用的元字符有以下几种

. 匹配除换行符外任何字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意空白字符
\d 匹配数字
\b 匹配单词开始或结束
^ 匹配字符串开始
$ 匹配字符串结束
- 表示范围
[] 匹配括号中任意一个字符
* + ? 量词

.字符组

如果匹配没有预定义的元字符
,可以使用字符组;只需要在[]内列出他们;

[aoeiou]匹配任何一个英文元音字母;
[
.?!] 匹配标点符号 . ? !

ps
:尽管[]号内有好多字符,但他只匹配单个字符


.转义

如果要匹配元字符本身
,比如?,直接匹配,会被当成元字符处理,这时候要使用转义;
\
?

:
\
? 就可匹配字符串中含有?的字符串

ps
:字符组中的元字符不需要转义

.反义

\W 匹配除字母或数字或下划线或汉字以外
\S 匹配除任意空白字符以外
\D 匹配除数字以外
\B 匹配不是单词开始或结束的位置

字符组的反义是加
^
[
^abc] 匹配除了abc这几个字母以外的任意字符

ps
:反义的特征是和一些已知元字符相反,并且为大写形式.字符组例外

.分支

| 表示分支

分支就是存在多种可能的匹配情况;如要匹配cat
,hat,fat,toat,就可以用分支形式
(c
|h|f|to)at

ps
:匹配分支条件时,从左到右测试每个条件,如果满足某个分支,就不再考虑其他条件.

.分组

重复单个字符需要限定符即可做到
,重复多个字符就需要分组;分组用小括号指定表达式,然后规定这个表达式重复的次数.


1.捕获
(
exp) 匹配exp,并捕获文本到自动命名组里
(
?<name>exp) 匹配exp,并捕获文本到name组里
(
?:exp) 匹配exp,不捕获,也不分配组号

示例1
:
<?php
$str = 'cat';
preg_match_all('/(c).*/', $str, $arr);
var_dump($arr);

输出(自动命名组)
:
array(2) {
[
0]=>
array(1) {
[
0]=>
string(3) "cat"
}
[
1]=>
array(1) {
[
0]=>
string(1) "c"
}
}

示例2
:
<?php
$str = 'cat';
preg_match_all('/(?<name>c).*/', $str, $arr);
var_dump($arr);

输出(多出一个test组)
:
array(3) {
[
0]=>
array(1) {
[
0]=>
string(3) "cat"
}
[
"test"]=>
array(1) {
[
0]=>
string(1) "c"
}
[
1]=>
array(1) {
[
0]=>
string(1) "c"
}
}

示例3
:
<?php
$str = 'cat';
preg_match_all('/(?:c).*/', $str, $arr);
var_dump($arr);

输出
:

array(1) {
[
0]=>
array(1) {
[
0]=>
string(3) "cat"
}
}

2.零宽断言(匹配的是事实,不是内容)
(
?=exp) 匹配exp前面的位置
(
?<=exp) 匹配exp后面的位置
(
?!exp) 匹配后面跟的不是exp的位置
(
?<!exp) 匹配前面跟的不是exp的位置

:
<?php
$str = 'testecattest';
preg_match_all('/(?=te)/', $str, $arr);

则输出
:
array(1) {
[
0]=>
array(3) {
[
0]=>
string(0) ""
[
1]=>
string(0) ""
[
2]=>
string(0) ""
}
}
匹配到三处


ps
:默认情况下,每个分组拥有一个组号,规则是从左到右,以分组的左括号为标志,第一个出现在分组里的为1,第二个为2,以此类推;分组0为整个表达式.

.反向引用

反向引用在于重复搜索前面某个分组匹配的文本
.

示例
:
$str = '[url]1.gif[/url]';
$img = preg_replace('/\[url\](\d+\.gif)\[\/url\]/', '<img src="$1" />', $str);
echo $img;

输出
<img src="1.gif" />

$1匹配了分组(\d
+\.gif)


.环视(零宽断言)

1.顺序肯定环视(?=exp)
断言自身出现位置的后面能匹配表达式exp
示例
:
<?php
$str = 'what are you doing testing?';
preg_match_all('/\b\w+(?=ing\b)/', $str, $arr);
var_dump($arr);

匹配do和test

2.逆序肯定环视(?<=exp)
断言自身出现位置的前面能匹配表达式exp
示例
:
<?php
$str = 'what are you doing testing?';
preg_match_all('/\b(?=ing)/', $str, $arr);
var_dump($arr);

匹配doing和testing

3.顺序否定环视(?!exp)

4.逆序否定环视(<!exp)




.常用修饰符/模式
1. i 忽略大小写
示例
:
<?php
$str = 'cat test CAT';
preg_match_all('/cat/i', $str, $arr);
var_dump($arr);

不加i修饰符
,只匹配cat

2. m 多行模式
仅当表达式中出现
^,$至少一个元字符且有换行符\n时,m修饰符才起作用;

:
$str = 'cat

test
cat
';

要提取cat

a
.不用多行模式
preg_match_all('/cat.*/', $str, $arr);

b
.用多行模式
preg_match_all('/cat.*$/m', $str, $arr);

3.s 点号统配模式(.号可以匹配换行符)
:
<?php
$str = 'cat
t
test
cat
f
';
preg_match_all('/t.*f/s', $str, $arr);
var_dump($arr);

输出
:
array(1) {
[
0]=>
array(1) {
[
0]=>
string(19) "t
t
test
cat
f
"
}
}


4.U 懒惰模式
等效于懒惰匹配

5.D 结尾限制
等效于结尾限定符

6.u 启用pcre中与perl不兼容的功能,模式字符串被当成utf-8

 

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告