当前位置 博文首页 > 文章内容

    关于php preg_replace_callback回调函数传参问题

    作者:shunshunshun18 栏目:未分类 时间:2020-12-17 15:00:18

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    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(
            '|<p>\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];
            }
       }
    }

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

    总结

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