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 中高效地处理字符串匹配和替换任务。