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