PHP函数:preg_replace()和preg_replace_callback() 【详记】

1.preg_replace()

preg_replace() 是 PHP 中的一个函数,用于使用正则表达式搜索并替换字符串中的内容。preg_replace() 直接将匹配的结果替换为指定的字符串,而不需要通过回调函数动态生成替换内容。

函数签名:

preg_replace(
    string|array $pattern,
    string|array $replacement,
    string|array $subject,
    int $limit = -1,
    int &$count = null
): string|array|null

参数说明:

  1. $pattern:正则表达式模式,匹配需要替换的部分。可以是字符串或数组,支持多个模式。
  2. $replacement:替换的内容。如果 $pattern 是数组,$replacement 也可以是数组,每个模式对应一个替换内容。
  3. $subject:要进行替换的字符串或数组。
  4. $limit(可选):限制替换的次数。默认值为 -1,表示不限制替换次数。
  5. $count(可选):传入的变量,用于记录实际进行了多少次替换。

返回值:

  • 如果 $subject 是字符串,返回一个替换后的字符串。
  • 如果 $subject 是数组,返回一个替换后的数组。
  • 如果没有匹配项,或者发生错误,返回 null

用法示例

1. 简单替换
$subject = "I have 123 apples and 456 oranges.";
$pattern = '/\d+/';  // 匹配所有数字
$replacement = 'many';  // 替换为 "many"

$result = preg_replace($pattern, $replacement, $subject);
echo $result;  // 输出: I have many apples and many oranges.

解释

  • 正则表达式 /\d+/ 匹配任意连续的数字。
  • 将所有匹配的数字替换为字符串 "many"
2. 使用模式替换多个内容
$subject = "I like red apples, blue berries, and green grapes.";
$pattern = ['/red/', '/blue/', '/green/'];  // 匹配 "red"、"blue"、"green"
$replacement = ['yellow', 'purple', 'orange'];  // 替换为 "yellow"、"purple"、"orange"

$result = preg_replace($pattern, $replacement, $subject);
echo $result;  // 输出: I like yellow apples, purple berries, and orange grapes.

解释

  • 使用数组格式的 $pattern$replacement,实现对多个不同模式进行替换。
3. 限制替换次数
$subject = "123 456 789 101112";
$pattern = '/\d+/';  // 匹配所有数字
$replacement = 'number';  // 替换为 "number"

$result = preg_replace($pattern, $replacement, $subject, 2);
echo $result;  // 输出: number number 789 101112

解释

  • 设置 limit = 2,表示只替换前两个匹配的数字,其余部分保持不变。
4. 捕获组替换
$subject = "John Smith, Jane Doe";
$pattern = '/(\w+) (\w+)/';  // 匹配名字和姓氏
$replacement = '$2, $1';  // 替换顺序为“姓氏, 名字”

$result = preg_replace($pattern, $replacement, $subject);
echo $result;  // 输出: Smith, John, Doe, Jane

解释

  • 使用捕获组 (\w+) (\w+) 匹配名字和姓氏。
  • 替换时使用 $2 引用第二个捕获的内容(姓氏),$1 引用第一个捕获的内容(名字)。
5. 使用 $count 记录替换次数
$subject = "apple, orange, banana, apple, orange";
$pattern = '/apple/';  // 匹配 "apple"
$replacement = 'pear';  // 替换为 "pear"
$count = 0;  // 记录替换次数

$result = preg_replace($pattern, $replacement, $subject, -1, $count);
echo $result;  // 输出: pear, orange, banana, pear, orange
echo "Replacements: $count";  // 输出: Replacements: 2

解释

  • 使用 $count 参数记录总共进行了多少次替换。

总结

  • preg_replace() 用于通过正则表达式在字符串中查找匹配项,并用指定的替换内容替换它们。
  • 通过 $pattern$replacement 的灵活组合,可以执行简单的替换、多个模式替换、捕获组替换等。
  • 还可以通过 $limit 控制替换的次数,或使用 $count 记录实际替换的次数。

2.preg_replace_callback()

preg_replace_callback() 是 PHP 中的一个函数,用于通过正则表达式搜索并替换字符串中的匹配项,并允许使用一个回调函数处理每个匹配的结果preg_replace() 不同的是,它不会直接指定替换字符串,而是让你在回调函数中动态生成替换内容。

函数签名:

preg_replace_callback(
    string|array $pattern,
    callable $callback,
    string|array $subject,
    int $limit = -1,
    int &$count = null
): string|array|null

参数说明:

  1. $pattern:要匹配的正则表达式,可以是一个字符串或数组,指定一个或多个正则模式。
  2. $callback:回调函数,preg_replace_callback() 会将每个匹配项作为参数传递给这个回调函数,并使用回调函数的返回值作为替换内容。
  3. $subject:要进行搜索和替换的字符串或数组。
  4. $limit(可选):替换的最大次数,默认值为 -1,表示没有限制。
  5. $count(可选):传入一个变量,用于记录执行的替换次数。

返回值:

  • 如果 $subject 是字符串,返回一个字符串,表示完成替换后的结果。
  • 如果 $subject 是数组,返回一个数组。
  • 如果发生错误,返回 null

用法示例

1. 简单例子
$subject = "Hello 123, this is 456.";
$pattern = '/\d+/';  // 匹配数字
$callback = function ($matches) {
    return $matches[0] * 2;  // 每个匹配的数字都乘以 2
};

$result = preg_replace_callback($pattern, $callback, $subject);
echo $result;  // 输出: Hello 246, this is 912.

解释

  • 正则表达式 /\d+/ 匹配任意连续的数字。
  • 回调函数将匹配的数字乘以 2。
  • 最终字符串中的数字 123456 分别替换为 246912
2. 替换日期格式
$subject = "Today is 2024-10-20.";
$pattern = '/(\d{4})-(\d{2})-(\d{2})/';
$callback = function ($matches) {
    return $matches[2] . '/' . $matches[3] . '/' . $matches[1];  // 重新排列日期格式为 MM/DD/YYYY
};

$result = preg_replace_callback($pattern, $callback, $subject);
echo $result;  // 输出: Today is 10/20/2024.

解释

  • 正则表达式 /(\d{4})-(\d{2})-(\d{2})/ 匹配日期格式 YYYY-MM-DD
  • 回调函数将匹配的日期重新排列为 MM/DD/YYYY 格式。
这里你或许会好奇为什么数组下标是1到3?

在 PHP 的 preg_replace_callback() 函数中,回调函数的参数 $matches 是一个数组,表示正则表达式匹配的结果。数组下标从 1 开始是因为 PHP 的正则表达式使用了 捕获组 的概念。具体来说:

捕获组的工作机制
  1. 捕获组: 在正则表达式中,使用圆括号 () 来定义捕获组。每个捕获组用于保存匹配的内容。例如,在正则表达式 /(foo)(bar)/ 中,有两个捕获组,分别捕获 foobar

  2. 数组下标:

    • $matches[0]: 存储整个匹配的字符串(即正则表达式完整匹配的结果)。
    • $matches[1], $matches[2], ...: 存储第一个、第二个等捕获组的匹配结果。

    例如,对于正则表达式 /(foo)(bar)/ 匹配字符串 "foobar"$matches 数组的内容如下:

    • $matches[0]: "foobar"(整个匹配结果)
    • $matches[1]: "foo"(第一个捕获组的结果)
    • $matches[2]: "bar"(第二个捕获组的结果)
3. 使用 $count 记录替换次数
$subject = "123 apples, 456 bananas, and 789 oranges.";
$pattern = '/\d+/';  // 匹配数字
$count = 0;
$callback = function ($matches) {
    return $matches[0] * 2;  // 将匹配的数字乘以 2
};

$result = preg_replace_callback($pattern, $callback, $subject, -1, $count);
echo $result;  // 输出: 246 apples, 912 bananas, and 1578 oranges.
echo "Replacements: $count";  // 输出: Replacements: 3

解释

  • 使用 $count 变量记录了替换的次数,此例中一共进行了 3 次替换。

总结

preg_replace_callback() 的优势在于可以根据匹配的结果动态生成替换内容,它特别适合处理复杂的替换逻辑,比如对匹配项进行某种计算或重新格式化。

最后附上一个我认为记得比较好的php其他函数链接:

PHP中常见的命令执行函数与代码执行函数_命令执行类似eval的有那些函数-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/898953.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

echart改变最后一个节点的图标

需求 在折线图的最后一个节点增加一个gif动图表示增长 一、静态图的使用 采用symbol属性进行设置,结果就是只能展示静态图 无法插入gif series: [{data: [150, 230, 224, 218, 135, 147, {value:200,symbol:image://https://ylxstatic.storage.ylingxin.com/va…

PostgreSQL数据库查看shared buffer配置

哈喽,大家好,我是木头左! PostgreSQL是一个功能强大的开源关系型数据库管理系统,广泛应用于各种规模的应用程序。在PostgreSQL中,shared buffer是一个重要的性能调优参数,它直接影响到数据库查询的性能。本…

【信息论基础第六讲】离散无记忆信源等长编码包括典型序列和等长信源编码定理

一、信源编码的数学模型 我们知道信源的输出是消息序列,对于信源进行编码就是用码字集来表示消息集,也就是要进行从消息集到码字集的映射。 根据码字的特征我们又将其分为D元码,等长码,不等长码,唯一可译码。 我们通过…

使用Yolov10和Ollama增强OCR

1. 训练自定义 Yolov10 数据集 利用物体检测增强 OCR 的第一步是在数据集上训练自定义 YOLO 模型。YOLO(只看一遍)是一种功能强大的实时对象检测模型,它将图像划分为网格,使其能够在一次前向传递中识别多个对象。这种方法非常适合…

Redis遇到Hash冲突怎么办?

这是小伙伴之前遇到的一个面试题,感觉也是一个经典八股,和大伙分享下。 一 什么是 Hash 冲突 Hash 冲突,也称为 Hash 碰撞,是指不同的关键字通过 Hash 函数计算得到了相同的 Hash 地址。 Hash 冲突在 Hash 表中是不可避免的&am…

eNSP网络基本配置

1.配置设备名称 网络上一般不会配属一台设备,管理员需要对这些设备进行统一管理。在进行设备调试的时候,首要任务是配置设备名称,设备名称用来唯一标识一台设备。 例如通过以下操作将设备名称设置为testA ? //可以查看用户视图…

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代,网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行,还是对外提供服务,网络都发挥着关键作用。对于网络工程师或IT运维人员…

雨情教务排课系统源码

PC端的雨情教务排课系统,是一款集功能性、实用性与便捷性于一体的教育管理工具。它全面支持班级设置功能,能够轻松管理不同年级、不同专业的班级信息,为后续的排课工作奠定坚实基础。在课程设置方面,系统允许管理者根据教学计划&a…

安装OpenResty

OpenResty OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点: 具备Nginx的完整功能 基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块…

Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题

文章目录 Git/SVN面试题Git和SVN有什么区别?SVN优缺点?Git优缺点?说一下Git创建分支的步骤?说一下Git合并的两种方法以及区别?Git如何查看文件的提交历史和分支的提交历史?什么是 git stash?什么是git sta…

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…

KBPC1010-ASEMI新能源专用方桥KBPC1010

编辑&#xff1a;ll KBPC1010-ASEMI新能源专用方桥KBPC1010 型号&#xff1a;KBPC1010 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 安装方式&#xff1a;直插 批号&#xff1a;2024 现货&#xff1a;50000 正向电流&#xff08;Id&#xff09;&#xff1a;10A 反向…

芯海休眠唤醒

这个电路要钱&#xff0c;降本需要去掉这个电路&#xff0c;让软件完全实现开关机的功能。 1、当按键按下的时候&#xff0c;K1下面接地&#xff0c;R12下面为低电平&#xff0c;同时BAT在左边供电&#xff0c;为高电平&#xff0c;Q2MOS管导通&#xff0c;给板子供电。 2、当…

【and design ProTable组件rowClassName属性进行判断修改行样式】

代码解析 注&#xff1a;行改变基于css效果 【导入css文件】 效果展示 代码块 自己导入cssrowClassName{(record)>{return record.jibie"高"?"row-style":""}}

Linux_进程终止_进程等待_进程替换

进程终止 不知道大家想过没有&#xff0c;我们写的main()函数的返回值是返回给谁的呢&#xff1f;其实是返回给父进程或者系统的。 int main() {std::cout << "hello" << std::endl;return 10; }运行该代码&#xff0c;输入hello&#xff0c;没问题&am…

I\O进程线程(Day32)

一、学习内容 进程之间的通信(nterprocess communication) 信号通信 概念 1> 信号通信中&#xff0c;多个进程只起到通知作用&#xff0c;没有数据传输的功能 2> 所谓信号通信&#xff0c;就是软件模拟的硬件的中断请求 3>原理图 信号处理方式 默认&#xff08;SIG_DF…

SpringBoot1~~~

目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import ​编辑 Conditional ImportResource 配置绑定Configur…

华为云购买弹性云服务器(教程)

配置弹性云服务器 基础配置 实例 操作系统

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

信息搜集 --子域名

1.证书查询 通过ssl证书指纹在crt.sh |证书搜索网站搜索 这些就是证书一样的 2.fofa等空间测绘平台查询 3.dns查询 https://dnsdumpster.com/ 4.威胁情报中心 360 微步等等 5.枚举 暴力破解 工具推荐&#xff1a;oneforall GitHub - shmilylty/OneForAll: OneForAll是一款…