当前位置: 首页 > article >正文

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博客


http://www.kler.cn/news/358700.html

相关文章:

  • Android 10.0 第三方app接收不到开机广播问题的解决以及开机自启动功能实现一
  • asp.net mvc return json()设置maxJsonLength
  • Day37 || 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 15分钟学Go 第9天:函数的定义与调用
  • C语言 | Leetcode C语言题解之第486题预测赢家
  • 用OpenCV写一个简单的尺寸检测程序
  • python+ffmpeg 屏幕录制程序
  • 多系统萎缩患者必看!这些维生素是你的“生命守护者”✨
  • 美国Honeywell霍尼韦尔气体检测仪SPXCDALMCX说明书
  • XML Schema 复合空元素
  • 若依前后端框架学习——新建模块(图文详解)
  • 深度学习相关知识点
  • 029 elasticsearch文档管理(ElasticsearchRepository、ElasticsearchRestTemplate)
  • VScode远程服务器之远程 远程容器 进行开发(五)
  • 第二代GPT-SoVITS V2:让声音克隆变得简单
  • Spark广播变量(类似小表广播)
  • 关于django这个python服务器的并发能力?
  • Java EE规范
  • 白炽灯和节能灯哪个更护眼?央视公认最好的护眼灯分享
  • Vue.js组件开发:深入理解与代码实现