两个正则表达式之间的差异

时间:2014-05-11 00:13:13

标签: php regex

我有这个正则表达式来修复损坏的序列化对象

$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
);

感谢大家的回答!

1 个答案:

答案 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);