php 传递匿名函数_php preg_replace_callback回调函数传参问题

本文详细介绍了PHP preg_replace_callback函数的使用,包括正则表达式搜索、回调函数的作用以及如何在回调中传递额外参数,通过实例演示了匿名函数和全局变量、面向对象的方式。阅读本文,掌握这一强大的字符串处理工具。
摘要由CSDN通过智能技术生成
fe9f0d68590174c7d627d334acd7da79.png

php中文网课程

每日17点准时技术干货分享

07b873546308f5a0a462149a4eb24d45.png

3266c561eada158e34dfcb4f1d583fe4.gif

preg_replace_callback

这个函数的作用是执行一个正则表达式搜索并且使用一个回调进行替换

preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

参数说明

  • pattern

要搜索的模式,可以是字符串或一个字符串数组。

  • callback

一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从 subject 中匹配到的结果。回调函数返回真正参与替换的字符串。这是该回调函数的签名:

  • handler ( array $matches ) : string

经常会需要 callback 函数而仅用于 preg_replace_callback() 一个地方的调用。在这种情况下,你可以使用 匿名函数 来定义一个匿名函数作为 preg_replace_callback() 调用时的回调。 这样做你可以保留所有调用信息在同一个位置并且不会因为一个不在任何其他地方使用的回调函数名称而污染函数名称空间。

Example #1 preg_replace_callback() 和 匿名函数

<?php /* 一个unix样式的命令行过滤器,用于将段落开始部分的大写字母转换为小写。 */$fp = fopen("php://stdin", "r") or die("can't read stdin");while (!feof($fp)) {    $line = fgets($fp);    $line = preg_replace_callback(        '|

\s*\w|'

, function ($matches) { return strtolower($matches[0]); }, $line ); echo $line;}fclose($fp);?>
  • subject

要搜索替换的目标字符串或字符串数组。

  • limit

对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是 -1(无限制)。

  • count

如果指定,这个变量将被填充为替换执行的次数。

如何传参

默认情况下,这个回调函数只会接收$matches这个匹配参数,如果想要传递更多的参数,我们可以采用迂回战术,正所谓条条大路通罗马,我们只要能在匿名函数中访问到需要传递的参数就行。于是我们有两个办法。

1.使用全局变量

$param1 = "test";preg_replace_callback($pregRule, function ($match) {    global $param1;    return $match[1] . $param1 . $match[3];}

2.使用面向对象加载类

class Scrapy{   private $param1 = "test";   public function info(){      preg_replace_callback($pregRule, function ($match) {            return $match[1] . $this->param1 . $match[3];        }   }}

通过上面的两种方法我们就可以在回调函数中调用我们想要传入的参数。

总结

办法总比问题多,遇到不能解决的问题,如果换一个思路,可能就会柳暗花明。

a2a61b45241bcc2985876667f1213f67.png

7fa8aee2bc56b2650e723866c9d68588.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值