PHP 中的正则表达式(Regular Expressions)是一种强大的工具,用于字符串的匹配、查找、替换等操作。PHP 支持两种主要的正则表达式语法:PCRE(Perl Compatible Regular Expressions) 和 POSIX 扩展正则表达式。不过,POSIX 扩展正则表达式在 PHP 5.3.0 中已被弃用,并在 PHP 7.0.0 中移除,因此现在主要使用 PCRE。
以下是 PHP 中常用的正则表达式语法和函数:
PCRE 正则表达式语法非常丰富,以下是一些常用的元字符和语法:
.:匹配除换行符以外的任意单个字符。^:匹配字符串的开始。$:匹配字符串的结束。*:匹配前面的子表达式零次或多次。+:匹配前面的子表达式一次或多次。?:匹配前面的子表达式零次或一次。{n}:匹配前面的子表达式恰好 n 次。{n,}:匹配前面的子表达式至少 n 次。{n,m}:匹配前面的子表达式至少 n 次,但不超过 m 次。[...]:字符类,匹配方括号中的任意一个字符。[^...]:否定字符类,匹配不在方括号中的任意一个字符。\d:匹配一个数字字符,等价于 [0-9]。\D:匹配一个非数字字符,等价于 [^0-9]。\w:匹配一个单词字符(字母、数字、下划线),等价于 [a-zA-Z0-9_]。\W:匹配一个非单词字符,等价于 [^a-zA-Z0-9_]。\s:匹配一个空白字符(空格、制表符、换行符等)。\S:匹配一个非空白字符。\b:匹配一个单词边界。\B:匹配一个非单词边界。|:或操作符,匹配左边或右边的表达式。():捕获组,用于捕获匹配的子字符串。(?:...):非捕获组,匹配但不捕获子字符串。(?=...):正向预查,匹配后面跟着指定模式的位置。(?!...):负向预查,匹配后面不跟着指定模式的位置。PHP 提供了多个函数来处理正则表达式,以下是一些常用的函数:
preg_match():执行一个正则表达式匹配,返回匹配的次数(0 或 1)。
$pattern = '/\d+/';
$subject = 'There are 123 apples.';
if (preg_match($pattern, $subject, $matches)) {
echo "Match found: " . $matches[0];
}
preg_match_all():执行全局正则表达式匹配,返回所有匹配的结果。
$pattern = '/\d+/';
$subject = 'There are 123 apples and 456 oranges.';
if (preg_match_all($pattern, $subject, $matches)) {
print_r($matches[0]);
}
preg_replace():执行正则表达式的搜索和替换。
$pattern = '/\d+/';
$replacement = 'X';
$subject = 'There are 123 apples and 456 oranges.';
$result = preg_replace($pattern, $replacement, $subject);
echo $result;
preg_split():通过正则表达式分割字符串。
$pattern = '/\s+/';
$subject = 'Split this string by spaces';
$result = preg_split($pattern, $subject);
print_r($result);
preg_grep():返回与模式匹配的数组元素。
$pattern = '/\d+/';
$array = ['apple', '123', 'orange', '456'];
$result = preg_grep($pattern, $array);
print_r($result);
preg_quote():转义正则表达式字符。
$string = 'This is a string with special characters: . * + ? ^ $ { } ( ) [ ] | \ /';
$quoted = preg_quote($string);
echo $quoted;
在正则表达式的末尾可以添加修饰符来改变匹配的行为:
i:不区分大小写匹配。m:多行模式,^ 和 $ 匹配每一行的开始和结束。s:单行模式,. 匹配包括换行符在内的所有字符。u:启用 UTF-8 模式。x:忽略空白字符和注释。例如:
$pattern = '/hello/i'; // 不区分大小写匹配 "hello"
以下是一些常见的正则表达式示例:
匹配电子邮件地址:
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
$email = 'example@example.com';
if (preg_match($pattern, $email)) {
echo "Valid email address.";
}
匹配 URL:
$pattern = '/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/';
$url = 'https://www.example.com';
if (preg_match($pattern, $url)) {
echo "Valid URL.";
}
匹配日期格式(YYYY-MM-DD):
$pattern = '/^\d{4}-\d{2}-\d{2}$/';
$date = '2023-10-05';
if (preg_match($pattern, $date)) {
echo "Valid date format.";
}
通过掌握这些正则表达式的基本语法和函数,你可以在 PHP 中高效地处理字符串匹配和替换任务。