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 ofpreg_replace_callback()
的注释作为输出
我猜 OP 知道字符串不变性。我将添加一个演示。
是的,我使用返回值作为输出。到目前为止,看起来它正在做它的工作,这是正确的答案。代码的其他部分无法正常工作,即我正在使用的序列化字符串似乎是多维数组。无论谁认为将序列化的 php 数据填充到数据库中是个好主意,都应该被绞死、刺伤、开枪然后被杀!
我将如何转换 $content = preg_replace('/\([A-Z_]+)\/e', "$1", $content);到 preg_replace_callback 函数?
@JonnyDevv 不需要回调,删除e
。以上是关于php 将 preg_replace 转换为 preg_replace_callback的主要内容,如果未能解决你的问题,请参考以下文章