史上最全的PHP正则表达式

PHP是一门广泛应用的编程语言,同时也是一门支持正则表达式的编程语言。正则表达式(Regular Expression)是一种文本模式,用来描述一定规则的字符串,通常用于匹配、替换和解析文本。在PHP中,可以使用preg系列函数来对文本进行正则匹配,preg系列函数包括preg_match、preg_match_all、preg_replace等。

正则表达式是一门独立的语言,不同的编程语言对正则表达式的实现会有所不同,因此本文所介绍的正则表达式主要是基于PHP实现的。下面将详细介绍PHP中的正则表达式,包括匹配模式、修饰符、元字符、分组、反义和案例说明等。

一、匹配模式

在PHP中,正则表达式的匹配模式主要包括:/i、/s、/m、/u、/x和/模式选项。其中,/i用于忽略大小写,/s用于匹配换行符,/m用于匹配多行,/u用于启用Unicode模式,/x用于忽略空格和注释。在使用preg系列函数时,可以在正则表达式字符串后面加上匹配模式,例如:

```php

preg_match('/[a-z]+/i', $str); // 匹配任意字母,忽略大小写

preg_match('/^a$/s', $str); // 匹配字符串"a",包括换行符

preg_match('/^\w+$/m', $str); // 匹配每行开头和结尾的单词字符,支持多行

preg_match('/\p{Han}/u', $str); // 匹配中文字符,启用Unicode模式

preg_match('/\w+/x', $str); // 匹配所有单词字符,忽略空格和注释

preg_match('/[a-z]+/i', $str, $matches, PREG_OFFSET_CAPTURE); // 匹配任意字母,忽略大小写,并返回匹配位置

```

除了上述的匹配模式之外,还可以使用/模式选项,该选项可以为preg系列函数提供更多的匹配模式,例如:

```php

preg_match('/pattern/模式选项', $str);

```

其中,模式选项包括:

模式选项|作用

-|-

e|将替换字符串作为PHP代码执行

u|启用Unicode模式

U|禁用模式量词贪婪模式

s|让.匹配所有字符,包括换行符

i|忽略大小写匹配

m|多行匹配

p|使$匹配行尾字符

x|禁止模式中的空格和#注释

A|强制从字符串开头匹配

D|强制从字符串结尾匹配

S|禁用PCRE的目录限制,避免DOS攻击

X|额外的PCRE功能,启用PCRE_EXTRA选项

二、修饰符

在使用正则表达式时,不同的修饰符可以为正则表达式提供不同的功能。PHP支持的修饰符包括:i、m、s、u、x、e、A、D、U、X和J。下面将详细介绍这些修饰符的作用和示例。

1. i修饰符

i修饰符的作用是忽略大小写,例如:

```php

$str = "hello world";

preg_match('/hello/i', $str); // 匹配"hello"或"Hello"或"HELLO"

preg_match('/world/i', $str); // 匹配"world"或"World"或"WORLD"

```

2. m修饰符

m修饰符的作用是多行匹配,例如:

```php

$str = "hello\nworld\n";

preg_match('/world/m', $str); // 匹配"world"(多行模式)

preg_match('/world/', $str); // 不匹配"world"(单行模式)

```

3. s修饰符

s修饰符的作用是让.匹配所有字符,包括换行符,例如:

```php

$str = "hello\nworld\n";

preg_match('/hello.world/s', $str); // 匹配"hello\nworld"

preg_match('/hello.world/', $str); // 不匹配"hello\nworld"

```

4. u修饰符

u修饰符的作用是启用Unicode模式,用于匹配UTF-8字符串,例如:

```php

$str = "中文测试";

preg_match('/\w/u', $str); // 匹配中文字符

```

5. x修饰符

x修饰符的作用是忽略空格和注释,用于提高正则表达式的可读性,例如:

```php

$str = "hello world";

preg_match('/

hello # 匹配"hello"

\s+ # 匹配1个或多个空格

world # 匹配"world"

/x', $str); // 匹配"hello world"

```

6. e修饰符

e修饰符用于将替换字符串作为PHP代码执行,例如:

```php

$str = "1+2=3";

echo preg_replace('/(\d+)\+(\d+)/e', "$1+$2.".", $str); // 输出"1+2.=3"

```

7. A修饰符和D修饰符

A修饰符和D修饰符是用于强制从字符串开头匹配和强制从字符串结尾匹配的,例如:

```php

$str = "hello world";

preg_match('/^hello/', $str); // 匹配"hello",强制从字符串开头匹配

preg_match('/world$/', $str); // 匹配"world",强制从字符串结尾匹配

```

8. U修饰符

U修饰符的作用是禁用模式量词贪婪模式,例如:

```php

$str = "hello world";

preg_match('/he.*o/', $str); // 贪婪匹配,匹配"hello world"

preg_match('/he.*?o/U', $str); // 非贪婪匹配,匹配"hello"

```

9. X修饰符

X修饰符的作用是额外的PCRE功能,启用PCRE_EXTRA选项,例如:

```php

$str = "hello world";

preg_match('/hello [a-z]{1,}/X', $str); // 匹配"hello world"

```

10. J修饰符

J修饰符是PHP 7.3新增的修饰符,用于启用PCRE2的现代匹配器,提高匹配效率。在PHP 7.3及以上版本中,可使用J修饰符,例如:

```php

$str = "hello world";

preg_match('/hello.j/UJ', $str); // 匹配"hello world",使用PCRE2匹配器

```

三、元字符

在正则表达式中,有些字符具有特殊意义,被称为元字符。下面将详细介绍PHP中常用的元字符。

1. .(点号)

点号可以匹配除换行符外的任意一个字符,例如:

```php

$str = "hello world";

preg_match('/hello./', $str); // 匹配"hello ",.匹配一个空格

```

2. ^(脱字符)

脱字符用于匹配字符串的开头位置,例如:

```php

$str = "hello world";

preg_match('/^hello/', $str); // 匹配"hello",强制从字符串开头匹配

preg_match('/^world/', $str); // 不匹配,因为"world"不在字符串开头

```

3. $(美元符号)

美元符号用于匹配字符串的结尾位置,例如:

```php

$str = "hello world";

preg_match('/world$/', $str); // 匹配"world",强制从字符串结尾匹配

preg_match('/hello$/', $str); // 不匹配,因为"hello"不在字符串结尾

```

4. [](字符集)

字符集用于匹配一组字符中的任意一个字符,例如:

```php

$str = "hello world";

preg_match('/[aeiou]/', $str); // 匹配"o",因为o在aeiou中

preg_match('/[a-z]/', $str); // 匹配所有小写字母

preg_match('/[^a-z]/', $str); // 匹配非小写字母的任意一个字符

```

5. ()(分组)

分组用于匹配一组字符的序列,可以为分组匹配指定量词和修饰符,例如:

```php

$str = "the quick brown fox jumps over the lazy dog";

preg_match('/(quick|lazy) brown/', $str); // 匹配"quick brown"或"lazy brown"

```

6. {}(量词)

量词用于指定字符集或分组的匹配次数,例如:

```php

$str = "hello world";

preg_match('/o{2}/', $str); // 匹配"oo",因为o出现了2次

preg_match('/o{1,}/', $str); // 匹配"o"和"oo"和"o",因为o出现了1次或多次

preg_match('/o{0,1}/', $str); // 匹配"o"和"",因为o出现了0次或1次

```

7. |(竖杠)

竖杠用于匹配两个分支中的任意一个,例如:

```php

$str = "the quick brown fox jumps over the lazy dog";

preg_match('/quick|lazy/', $str); // 匹配"quick"或"lazy"

```

8. \(反斜线)

反斜线用于转义元字符,也可以用于匹配一些特殊字符,例如:

```php

$str = "hello world";

preg_match('/\w/', $str); // 匹配"hello"中的任意一个单词字符

preg_match('/\d/', $str); // 不匹配数字,因为"hello world"中没有数字

preg_match('/\s/', $str); // 匹配空格字符

```

四、分组

在正则表达式中,可以使用分组来对一组字符进行匹配或操作,或者为分组匹配指定量词和修饰符。下面将详细介绍PHP中的分组。

1. 捕获分组

捕获分组用于提取正则表达式匹配的结果,可以为捕获分组指定名称,例如:

```php

$str = "john.doe@example.com";

preg_match('/(?P\w+)\.(?P\w+)@(?P\w+)\.com/', $str, $match);

print_r($match); // 输出Array([0] => john.doe@example.com [name] => john [1] => john [lastname] => doe [2] => doe [domain] => example [3] => example)

```

2. 非捕获分组

非捕获分组用于匹配一组字符的序列,但不会将匹配结果保存为捕获分组,例如:

```php

$str = "the quick brown fox jumps over the lazy dog";

preg_match('/(?:quick|lazy) brown/', $str); // 匹配"quick brown"或"lazy brown",但不保存为捕获分组

```

3. 后向引用分组

后向引用分组用于从匹配结果中提取指定的子串,例如:

```php

$str = "2018-11-23";

preg_match('/(?P\d{4})-(?P\d{2})-(?P\d{2})/', $str, $match);

echo $match['mon']; // 输出"11"

```

四、反义

在正则表达式中,可以使用反义序列来匹配一些特殊字符。在PHP中,常用的反义序列如下:

反义序列|作用

-|-

\d|匹配非数字字符

\s|匹配非空白字符

\w|匹配非单词字符

\D|匹配数字字符

\S|匹配空白字符

\W|匹配单词字符

例如:

```php

$str = "hello world";

preg_match('/\W/', $str); // 匹配空格,因为\W匹配非单词字符

```

五、案例说明

下面将为大家介绍一些正则表达式的应用案例。

1. 简单的邮箱地址验证

```php

$email = "john.doe@example.com";

if (preg_match('/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/', $email)) {

echo "邮箱地址合法";

} else {

echo "邮箱地址非法";

}

```

2. 提取HTML标签属性

```php

$html = 'example.com';

preg_match('/([^<]+)<\/a>/', $html, $match);

echo $match[1]; // 输出"http://example.com"

echo $match[2]; // 输出"example.com"

```

3. 日期格式转换

```php

$date = "2018-11-23";

if (preg_match('/^(?P\d{4})-(?P\d{2})-(?P\d{2})$/', $date, $match)) {

echo $match['day'].'/'.$match['mon'].'/'.$match['year'];

} else {

echo "日期格式非法";

}

```

4. 去除HTML标签

```php

$html = '

这是一段包含HTML的文本

';

$text = preg_replace('/<[^>]+>/', '', $html); // 去除所有html标签,只留下纯文本

echo $text; // 输出"这是一段包含HTML的文本"

```

5. 格式化银行卡号

```php

$card = "6222020200017216788";

$formatted = preg_replace('/(\d{4})(?=\d)/', '$1 ', $card); // 格式化银行卡号,每4位数字加一个空格

echo $formatted; // 输出"6222 0202 0001 7216 788"

```

总结

本文详细介绍了PHP中的正则表达式,包括匹配模式、修饰符、元字符、分组、反义和案例说明等。掌握正则表达式可以帮助我们更方便地进行文本匹配和处理,使代码更加简洁和高效。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(45) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部