我有这个正则表达式来修复损坏的序列化对象
$data = preg_replace(
'!s:(\d+):"(.*?)";!se',
"'s:' . strlen('$2') . ':\"$2\";'",
$data
);
但最近更新了PHP 5.5+的代码,因为/ e修饰符已被弃用
$data = preg_replace_callback(
'/s:(\d+):"(.*?)";/',
create_function(
'$matches',
'return "s:".strlen($matches[2]).":\"".( $matches[2] )."\";";'
),
$data
);
我已经分析了两个函数的返回数据,似乎新的删除了额外的斜杠
结果为1
<a title=\\"A sample title\\" href=\\"http://sitei-url.com/\\">text</a>
结果为2
<a title=\"A sample title\" href=\"http://sitei-url.com/\">text</a>
当我尝试unserialize
返回的数据时,第一个工作正常,但第二个没有
我很感激对此有所帮助!
由于
修改
这个似乎是第一个。添加了s参数。
$data = preg_replace_callback(
'/s:(\d+):"(.*?)";/s',
create_function(
'$matches',
'return "s:".strlen($matches[2]).":\"".( $matches[2] )."\";";'
),
$data
);
感谢大家的回答!
答案 0 :(得分:0)
closure
的示例:
$data = preg_replace_callback(
'/s:(\d+):"(.*?)";/',
function($matches) {
return "s:" . strlen($matches[2]) . ":\\\"" . $matches[2] . "\\\";";
),
$data
);
EDIT for PHP 5.2兼容性
function pregCallback($matches) {
return "s:" . strlen($matches[2]) . ":\\\"" . $matches[2] . "\\\";";
}
$data = preg_replace_callback('/s:(\d+):"(.*?)";/', 'pregCallback', $data);