正则表达式(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程序员必备的重要技能之一。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)