从零开始学习正则表达式,这10个PHP函数绝不能错过
正则表达式是一种强大的工具,能够对字符串进行高级的匹配和处理。在PHP中,正则表达式常用于验证表单数据、过滤输入、搜索字符串等多个场景。本文将介绍从零开始学习正则表达式所需掌握的基础知识,并列出10个PHP函数,帮助你更好地掌握正则表达式。
一、基础知识
1.语法
正则表达式由一组字符和特殊字符组成,并且遵循特定的语法规范。下面是常用的语法规则:
- 元字符:用于匹配特定的字符(如字母、数字、特殊字符),例如\d(数字)、\w(字母、数字、下划线)、\s(空格、制表符等);
- 限定符:用于指定匹配元字符的数量,例如+(出现一次或多次)、*(出现零次或多次)、?(出现零次或一次)、{n}(出现n次);
- 边界:用于匹配字符串边界或特定字符的边界,例如^(匹配字符串的开头)、$(匹配字符串的结尾)、\b(匹配单词边界);
- 分组:用于分组和操作子字符串,例如(),(?:)(非捕获分组);
- 转义字符:用于匹配元字符本身,例如\+(匹配+字符)。
2.函数
在PHP中,有很多内置函数可以帮助我们操作正则表达式。
二、10个PHP函数
1.preg_match()
preg_match()函数用于查找与指定模式匹配的 个字符串,并返回与该模式匹配的次数。
参数:
- pattern:要检索的模式,可以是一个字符串或一个正则表达式;
- subject:要搜索的字符串;
- matches:用于存储匹配项的数组。
示例:
$pattern = "/php/i";
$subject = "PHP is the web scripting language of choice.";
if (preg_match($pattern, $subject, $matches)) {
echo "Match found!";
} else {
echo "Match not found.";
}
输出:
Match found!
2.preg_match_all()
preg_match_all()函数与preg_match()函数类似,但是它会匹配所有符合模式的字符串,并返回匹配次数。
参数:
- pattern:要检索的模式,可以是一个字符串或一个正则表达式;
- subject:要搜索的字符串;
- matches:用于存储匹配项的数组;
- flags:选项标志(可选参数),用于指定匹配模式和搜索选项。
示例:
$pattern = "/php/i";
$subject = "PHP is the web scripting language of choice. PHP is used to create dynamic content.";
if (preg_match_all($pattern, $subject, $matches)) {
echo "Match found " . count($matches[0]) . " times.";
} else {
echo "Match not found.";
}
输出:
Match found 2 times.
3.preg_replace()
preg_replace()函数用于查找和替换与模式匹配的字符串。
参数:
- pattern:要检索的模式,可以是一个字符串或一个正则表达式;
- replacement:用于替换匹配项的字符串;
- subject:要搜索的字符串;
- limit:指定替换的最大次数(可选参数)。
示例:
$pattern = "/php/i";
$replacement = "Java";
$subject = "PHP is the web scripting language of choice.";
echo preg_replace($pattern, $replacement, $subject);
输出:
Java is the web scripting language of choice.
4.preg_split()
preg_split()函数用于将一个字符串拆分为一个数组,根据正则表达式匹配的位置进行拆分。
参数:
- pattern:用于分割字符串的模式,可以是字符串或正则表达式;
- subject:要分割的字符串;
- limit:指定拆分的最大次数(可选参数),默认为-1。
示例:
$pattern = "/[\s,]+/";
$subject = "PHP,Java,Python,C++";
print_r(preg_split($pattern, $subject));
输出:
Array
(
[0] => PHP
[1] => Java
[2] => Python
[3] => C++
)
5.preg_grep()
preg_grep()函数用于返回匹配模式的数组元素。
参数:
- pattern:要检索的模式,可以是一个字符串或一个正则表达式;
- input:要搜索的数组;
- flags:选项标志(可选参数),用于指定匹配模式和搜索选项。
示例:
$pattern = "/^PHP/";
$array = array("PHP is the web scripting language of choice.", "Java is not bad.", "Python is also a good choice.");
print_r(preg_grep($pattern, $array));
输出:
Array
(
[0] => PHP is the web scripting language of choice.
)
6.preg_quote()
preg_quote()函数用于转义正则表达式中的特殊字符。
参数:
- str:要转义的字符串;
- delimiter:可选参数,默认使用/作为分隔符。
示例:
$str = "php language is very good!";
echo preg_quote($str);
输出:
php language is very good\!
7.preg_last_error()
preg_last_error()函数用于返回最后一次执行preg函数时发生的错误代码。
示例:
$pattern = '/(regex/';
preg_match($pattern, "PHP is the web scripting language of choice.");
echo "Last error code: " . preg_last_error();
输出:
Last error code: 2
注: preg_last_error()返回的错误代码可以通过preg_error_constant()函数转换成对应的常量。
8.preg_replace_callback()
preg_replace_callback()函数与preg_replace()函数类似,但是它接受一个回调函数来处理匹配项。
参数:
- pattern:用于检索的模式;
- callback:回调函数,在每个匹配项上执行;
- subject:要搜索的字符串;
- limit:指定替换的最大次数(可选参数)。
示例:
function callback($matches) {
return $matches[1] . "World";
}
$pattern = "/(\w+)\s/";
$subject = "Hello PHP, Hello Python, Hello Java";
echo preg_replace_callback($pattern, "callback", $subject);
输出:
Hello World, Hello World, Hello World
9.preg_filter()
preg_filter()函数与preg_replace()函数类似,但是它只返回替换后的值。
参数:
- pattern:用于检索的模式;
- replacement:替换值;
- subject:要搜索的字符串;
- limit:指定替换的最大次数(可选参数)。
示例:
$pattern = "/php/i";
$replacement = "Java";
$subject = "PHP is the web scripting language of choice.";
echo preg_filter($pattern, $replacement, $subject);
输出:
Java is the web scripting language of choice.
10.preg_match_all()中的$matches
除了preg_match_all()函数以外,还有一种方法可以获得与正则表达式匹配的数据:$matches数组。$matches是用于存储匹配项的数组,在每个匹配项中都会包含一个或多个子组。
示例:
$pattern = "/(\w+)\s(\w+)/";
$subject = "Hello PHP, Hello Python, Hello Java";
if (preg_match_all($pattern, $subject, $matches)) {
echo $matches[0][0] . "
";
echo $matches[1][0] . "
";
echo $matches[2][0] . "
";
echo $matches[0][1] . "
";
echo $matches[1][1] . "
";
echo $matches[2][1] . "
";
}
输出:
Hello PHP
Hello
PHP
Hello Python
Hello
Python
注:$matches数组的结构是多维数组,其下标的含义如下:
- $matches[0]:包含完整的字符串匹配项;
- $matches[1]:包含 个子
