【问题标题】:php converting preg_replace to preg_replace_callbackphp 将 preg_replace 转换为 preg_replace_callback
【发布时间】:2016-05-18 16:53:03
【问题描述】:

我正在处理这个旧代码,但遇到了这个 - 失败了:

preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject);

它告诉我 preg_replace e 修饰符已被弃用,而是使用 preg_replace_callback。

据我了解,我应该将 's:'.strlen('$2').':\"$2\";' 部分替换为在比赛中进行替换的回调函数。

我不太明白的是,我将要替换的正则表达式正在做什么。将 php 序列化数据填充到数据库字段(愚蠢,我知道......)中,并修复它们以重新插入,这是其中的一部分。

那么任何人都可以解释那个位在做什么,或者我应该用什么替换它?

【问题讨论】:

    标签: php regex preg-replace pcre preg-replace-callback


    【解决方案1】:

    使用

    preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) {
          return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
    }, $sObject);
    

    必须删除!e 修饰符。 $2 反向引用必须替换为$m[2],其中$m 是一个包含匹配值和子匹配的匹配对象,它被传递给preg_replace_callback 内的匿名函数。

    这是一个demo,其中s: 之后的数字被替换为$m[2] 长度:

    $sObject = 's:100:"word";';
    $res = preg_replace_callback('!s:(\d+):"(.*?)";!', function($m) {
          return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
    }, $sObject);
    echo $res; // => s:4:"word";
    

    【讨论】:

    • 很好 - 给 use the return value of preg_replace_callback() 的注释作为输出
    • 我猜 OP 知道字符串不变性。我将添加一个演示。
    • 是的,我使用返回值作为输出。到目前为止,看起来它正在做它的工作,这是正确的答案。代码的其他部分无法正常工作,即我正在使用的序列化字符串似乎是多维数组。无论谁认为将序列化的 php 数据填充到数据库中是个好主意,都应该被绞死、刺伤、开枪然后被杀!
    • 我将如何转换 $content = preg_replace('/\{([A-Z_]+)\}/e', "$1", $content);到 preg_replace_callback 函数?
    • @JonnyDevv 不需要回调,删除e
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多