【详记】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
参数说明:
$pattern:正则表达式模式,匹配需要替换的部分。可以是字符串或数组,支持多个模式。
$replacement:替换的内容。如果 $pattern 是数组,$replacement 也可以是数组,每个模式对应一个替换内容。
$subject:要进行替换的字符串或数组。
$limit(可选):限制替换的次数。默认值为 -1,表示不限制替换次数。
$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
参数说明:
$pattern:要匹配的正则表达式,可以是一个字符串或数组,指定一个或多个正则模式。
$callback:回调函数,preg_replace_callback() 会将每个匹配项作为参数传递给这个回调函数,并使用回调函数的返回值作为替换内容。
$subject:要进行搜索和替换的字符串或数组。
$limit(可选):替换的最大次数,默认值为 -1,表示没有限制。
$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。
最终字符串中的数字 123 和 456 分别替换为 246 和 912。
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)/ 中,有两个捕获组,分别捕获 foo 和 bar。
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() 的优势在于可以根据匹配的结果动态生成替换内容,它特别适合处理复杂的替换逻辑,比如对匹配项进行某种计算或重新格式化。
1、本站一切资源仅代表作者本人的立场,并不代表本站赞同其观点和对其真实性负责。
2、转载或引用本站版权所有之内容,需注明转载(或引用)CNBOX.NET字样,并表明网址
3、本站所有图片和资源来源于用户上传和网络,仅用作展示,如有侵权请联系站长
暂无评论