preg_replace_callback遇到的问题
2017-08-04

中午的时候,碰到preg_replace_callback回调的问题,测试机没有问题,线上却报语法错误,最初的写法如下,初步判断支持5.2以上的版本,可惜版本服务器是5.2,不能使用,坑。

$str = preg_replace_callback(    //执行一个正则表达式搜索并且使用一个回调进行替换
    '/./u',
    function (array $match) {
        return strlen($match[0]) >= 4 ? '[emoji]' : $match[0];
    },
    $str);


查了一下百度,国外友人说需要create_function方法,有个demo,没怎么看懂,如下

function parse_csv($csv_string, $delimiter = ",", $skip_empty_lines = true, $trim_fields = true){
    $enc = preg_replace('/(?<!")""/', '!!Q!!', $csv_string);
    $enc = preg_replace_callback(
        '/"(.*?)"/s',
        function ($field) {
            return urlencode($field[1]);
        },
        $enc
    );
    $lines = explode("\n",$enc);
    return array_map(
        function ($line) use ($delimiter, $trim_fields) {
            $fields = $trim_fields ? array_map('trim', explode($delimiter, $line)) : explode($delimiter, $line);
            return array_map(
                function ($field) {
                    return str_replace('!!Q!!', '"', urldecode($field));
                },
                $fields
            );
        },
        $lines
    );
}


return array_map(
    create_function('$line', '
        global $delimiter, $trim_fields;
        $fields = $trim_fields ? array_map(\'trim\', explode($delimiter, $line)) : explode($delimiter, $line);
        return array_map(
            function ($field) {
                return str_replace(\'!!Q!!\', \'"\', urldecode($field));
            },
            $fields
        );',
    $lines
);

我尝试了,貌似不行,可能我的写法有问题吧。然后我就想着直接回调得了,方法如下

$str = preg_replace_callback('/./u', function($match) {
        return strlen($match[0]) >= 4 ? '[emoji]' : $match[0];
    }, $str);
    return $str;

还是报错。Parse error: syntax error, unexpected T_FUNCTION 。分析了一下,指定是function的问题,只能用一个笨办法解决吧,如下

function filter_Emoji($str)
{

    return preg_replace_callback(
        '/./u',
        "fiter_Emoji_fun",
        $str);
}

function fiter_Emoji_fun($match)
{
    return strlen($match[0]) >= 4 ? '[emoji]' : $match[0];
}

就这样吧,笨是笨了点,但是解决了。

分享: