PHP PCRE 学习笔记
什么是 PCRE
PCRE 是 Perl Compatible Regular Expressions 的缩写,即 Perl 兼容正则表达式。它是一个开源的正则表达式库,由 Philip Hazel 开发。
PHP 中的 preg 系列函数都是使用 PCRE 库实现的。
基本语法
PCRE 支持大部分 Perl 正则表达式语法,下面是一些基本语法:
- 字符匹配:使用字符直接匹配。例如
ab
匹配ab
。 - 字符类:使用方括号
[...]
匹配对应的字符。例如[abc]
匹配a
或b
或c
。 - 反义字符类:使用方括号
[^...]
匹配不在字符类中的字符。例如[^abc]
匹配除了a
、b
、c
以外的其他字符。 - 元字符:元字符包括
^
、$
、.
、\
、|
、+
、*
、?
、()
等。它们可以用来表示位置、任意字符、特殊字符等。 - 量词:用来表示匹配次数的字符。包括
{n}
、{n,}
、{n,m}
。例如a{2}
匹配aa
,a{2,}
匹配两个以上的a
,a{2,5}
匹配两个到五个a
。 - 转义字符:使用反斜杠
\
转义元字符的特殊含义。例如\.
匹配点号.
。
常用函数
preg_match
用于从字符串中匹配第一个符合条件的子串。
phpCopy Codepreg_match($pattern, $subject, $matches)
$pattern
:正则表达式模式。$subject
:输入字符串。$matches
:用于存储匹配结果的数组。
下面是一个例子:
phpCopy Code$pattern = '/(hello) (\w+)/i';
$subject = 'Hello world!';
if (preg_match($pattern, $subject, $matches)) {
echo "匹配成功!\n";
var_dump($matches);
} else {
echo "匹配失败!\n";
}
输出结果:
Copy Code匹配成功!
array(3) {
[0]=>
string(11) "Hello world"
[1]=>
string(5) "Hello"
[2]=>
string(5) "world"
}
preg_replace
用于替换字符串中符合条件的子串。
phpCopy Codepreg_replace($pattern, $replacement, $subject)
$pattern
:正则表达式模式。$replacement
:替换字符串。$subject
:输入字符串。
下面是一个例子:
phpCopy Code$pattern = '/world/i';
$replacement = 'PHP';
$subject = 'Hello world!';
$result = preg_replace($pattern, $replacement, $subject);
echo $result; // 输出 Hello PHP!
preg_split
用于将字符串分割成数组,根据正则表达式模式分割。
phpCopy Codepreg_split($pattern, $subject)
$pattern
:正则表达式模式。$subject
:输入字符串。
下面是一个例子:
phpCopy Code$pattern = '/\s+/';
$subject = "Hello\nworld!";
$result = preg_split($pattern, $subject);
print_r($result); // 输出 Array ( [0] => Hello [1] => world! )
实例
下面是一个实例,通过 PCRE 实现匹配身份证号和手机号。
phpCopy Code$test_str = '这是一个身份证号码 510101199010014250 和一个手机号码 13512345678';
$id_pattern = '/\d{17}[\dX]/'; // 匹配身份证号
$phone_pattern = '/1\d{10}/'; // 匹配手机号
$id_matches = [];
$phone_matches = [];
if (preg_match($id_pattern, $test_str, $id_matches)) {
echo "匹配到身份证号:", $id_matches[0], "\n";
}
if (preg_match($phone_pattern, $test_str, $phone_matches)) {
echo "匹配到手机号:", $phone_matches[0], "\n";
}
输出结果:
Copy Code匹配到身份证号:510101199010014250
匹配到手机号:13512345678