php 将 preg_replace 转换为 preg_replace_callback

Posted

技术标签:

【中文标题】php 将 preg_replace 转换为 preg_replace_callback【英文标题】:php converting preg_replace to 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 序列化数据填充到数据库字段(愚蠢,我知道......)中,并修复它们以重新插入,这是其中的一部分。

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

【问题讨论】:

【参考方案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

以上是关于php 将 preg_replace 转换为 preg_replace_callback的主要内容,如果未能解决你的问题,请参考以下文章

无法将带有修饰符 /e 的 preg_replace() 转换为 preg_replace_callback()

php实现转换html格式为文本格式的方法

使用PHP将日期转换为YYYY-MM-DD

PHP将纯文本转换为标签链接

PHP:输出一行不带preg_replace的HTML文档

PHP preg_replace使用例子