正则表达式(Regex)在PHP中是处理字符串匹配和替换的强大工具,它可以帮助我们高效地进行文本处理、数据验证和模式提取。
1. 正则表达式语法:在PHP中,正则表达式主要有两种语法风格:PCRE(Perl兼容正则表达式)和POSIX扩展(已废弃)。我们主要使用PCRE语法。
1.1 定界符
PHP正则表达式通常使用定界符包裹,常用定界符包括:
| /pattern/ |
| #pattern# |
| ~pattern~ |
比如我们可以 这样定义变量:
// 使用斜杠作为定界符 $regex = '/dotcpp/i'; // 使用井号作为定界符(当模式中包含斜杠时很有用) $regex = '#https?://dotcpp\.com#'; // 使用波浪线作为定界符 $regex = '~pattern~';
1.2 创建正则表达式
// 方式1:使用字符串直接创建 $pattern = '/dotcpp/i'; // 方式2:使用变量动态构建 $site = 'dotcpp'; $pattern = "/$site/i";
2. 正则表达式模式
2.1 元字符
<?php
/* 边界符 */
$pattern = '/^dotcpp/'; // 匹配以dotcpp开头的字符串
$pattern = '/dotcpp$/'; // 匹配以dotcpp结尾的字符串
$pattern = '/^dotcpp$/'; // 精确匹配dotcpp
$pattern = '/\bdotcpp\b/'; // 匹配单词dotcpp
/* 量词 */
$pattern = '/do*tcpp/'; // t前有0个或多个o
$pattern = '/do+tcpp/'; // t前有1个或多个o
$pattern = '/do?tcpp/'; // t前有0个或1个o
$pattern = '/do{2}tcpp/'; // t前恰好有2个o
$pattern = '/do{2,}tcpp/'; // t前至少有2个o
$pattern = '/do{1,3}tcpp/'; // t前有1到3个o
/* 字符类 */
$pattern = '/d.tcpp/'; // 匹配d和t之间的任意单个字符
$pattern = '/\d+/'; // 匹配一个或多个数字
$pattern = '/\D+/'; // 匹配一个或多个非数字
$pattern = '/\w+/'; // 匹配字母、数字、下划线
$pattern = '/\W+/'; // 匹配非字母、数字、下划线
$pattern = '/\s+/'; // 匹配空白字符
$pattern = '/\S+/'; // 匹配非空白字符
$pattern = '/[abc]/'; // 匹配a、b或c中的任意一个
$pattern = '/[^abc]/'; // 匹配除了a、b、c之外的字符
$pattern = '/[a-z]/'; // 匹配小写字母
?>2.2 分组和捕获
// 分组但不捕获
$pattern = '/(?:www\.)?dotcpp\.com/';
// 分组并捕获
$pattern = '/(\d{4})-(\d{2})-(\d{2})/'; // 捕获年月日
// 命名捕获组
$pattern = '/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/';3. 正则表达式修饰符
<?php $pattern = '/dotcpp/i'; // 不区分大小写 $pattern = '/dotcpp/m'; // 多行模式,^和$匹配每行的开始和结束 $pattern = '/dotcpp/s'; // 使.匹配包括换行符在内的所有字符 $pattern = '/dotcpp/u'; // Unicode模式,正确处理UTF-8字符 $pattern = '/dotcpp/x'; // 忽略空白和注释,可以格式化复杂正则 $pattern = '/dotcpp/A'; // 从目标字符串开头开始匹配 $pattern = '/dotcpp/D'; // $仅匹配目标字符串的末尾 ?>
4. PHP正则表达式函数
4.1 preg_match() - 执行匹配
<?php
$string = "Welcome to dotcpp.com";
$pattern = '/dotcpp/i';
if (preg_match($pattern, $string, $matches)) {
echo "找到匹配: " . $matches[0];
} else {
echo "未找到匹配";
}
// 输出:找到匹配: dotcpp
?>4.2 preg_match_all() - 全局匹配
<?php
$text = "欢迎访问dotcpp的教程页面:https://www.dotcpp.com/course/ds/ 和 https://www.dotcpp.com/course/c/ 都是很好的学习资源";
$pattern = '/https?:\/\/www\.dotcpp\.com\/course\/\w+\//';
if (preg_match_all($pattern, $text, $matches)) {
echo "找到的dotcpp教程网址:\n";
print_r($matches[0]);
}
/* Array
(
[0] => https://www.dotcpp.com/course/ds/
[1] => https://www.dotcpp.com/course/c/
)
*/
?>4.3 preg_replace() - 搜索和替换
<?php $string = "dotcpp.com for coding"; $pattern = '/dotcpp\.com/'; $replacement = 'www.dotcpp.com'; $result = preg_replace($pattern, $replacement, $string); echo $result;// 输出:www.dotcpp.com for coding ?>
总结:PHP中的正则表达式通过PCRE函数提供强大的字符串处理能力。掌握正则表达式的基本语法、修饰符和常用函数,可以大大提高文本处理的效率和灵活性。在实际开发中,正则表达式常用于数据验证、文本提取、字符串替换等场景,是PHP程序员必备的重要技能之一。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程