Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 两个正则表达式之间的差异_Php_Regex - Fatal编程技术网

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

Php 两个正则表达式之间的差异,php,regex,Php,Regex,我用这个正则表达式来修复损坏的序列化对象 $data = preg_replace( '!s:(\d+):"(.*?)";!se', "'s:' . strlen('$2') . ':\"$2\";'", $data ); 但是最近更新了PHP5.5+的代码,因为/e修饰符已被弃用 $data = preg_replace_callback( '/s:(\d+):"(.*?)";/', create_function( '$match

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

$data = preg_replace(
    '!s:(\d+):"(.*?)";!se',
    "'s:' . strlen('$2') . ':\"$2\";'", 
    $data
);
但是最近更新了PHP5.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> 

谢谢大家的回答

带有
闭包的示例

$data = preg_replace_callback(
    '/s:(\d+):"(.*?)";/', 
    function($matches) { 
        return "s:" . strlen($matches[2]) . ":\\\"" . $matches[2] . "\\\";";
    ),
    $data
);
编辑PHP 5.2兼容性

function pregCallback($matches) {
    return "s:" . strlen($matches[2]) . ":\\\"" . $matches[2] . "\\\";";
}

$data = preg_replace_callback('/s:(\d+):"(.*?)";/', 'pregCallback', $data);

如果第一个有效,为什么不直接使用它呢?你想在这里实现什么?第一个也有
s
修饰符,你不在第二个上使用它吗?请同时显示一个输入数据的示例。将你的
“:\”($matches[2])。“\”;“
改为
”:\”($matches[2])。“\\”;“
@php dev生成一个语法错误,意外的“'解析错误:语法错误,意外的T_返回”在PHP 5.2.17中,编辑后的文件还将序列化数据“替换为”如s:15:“显示”小部件“;原始数据
s:45:“文本”
必须如下所示
s:45:“文本”
您的文件返回此
s:45:“文本”
$data = preg_replace_callback(
    '/s:(\d+):"(.*?)";/', 
    function($matches) { 
        return "s:" . strlen($matches[2]) . ":\\\"" . $matches[2] . "\\\";";
    ),
    $data
);
function pregCallback($matches) {
    return "s:" . strlen($matches[2]) . ":\\\"" . $matches[2] . "\\\";";
}

$data = preg_replace_callback('/s:(\d+):"(.*?)";/', 'pregCallback', $data);