PHP PCRE 学习笔记

什么是 PCRE

PCRE 是 Perl Compatible Regular Expressions 的缩写,即 Perl 兼容正则表达式。它是一个开源的正则表达式库,由 Philip Hazel 开发。

PHP 中的 preg 系列函数都是使用 PCRE 库实现的。

基本语法

PCRE 支持大部分 Perl 正则表达式语法,下面是一些基本语法:

  • 字符匹配:使用字符直接匹配。例如 ab 匹配 ab
  • 字符类:使用方括号 [...] 匹配对应的字符。例如 [abc] 匹配 abc
  • 反义字符类:使用方括号 [^...] 匹配不在字符类中的字符。例如 [^abc] 匹配除了 abc 以外的其他字符。
  • 元字符:元字符包括 ^$.\|+*?() 等。它们可以用来表示位置、任意字符、特殊字符等。
  • 量词:用来表示匹配次数的字符。包括 {n}{n,}{n,m}。例如 a{2} 匹配 aaa{2,} 匹配两个以上的 aa{2,5} 匹配两个到五个 a
  • 转义字符:使用反斜杠 \ 转义元字符的特殊含义。例如 \. 匹配点号 .

常用函数

preg_match

用于从字符串中匹配第一个符合条件的子串。

phpCopy Code
preg_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 Code
preg_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 Code
preg_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