在某些条件下PHP中的表情符号替换

时间:2014-12-05 18:50:29

标签: php html regex preg-replace

我正在寻找替换php中的表情符号的方法,我的代码如下。

function emotify($text)
{
    $icons = array(
        '3:)'   =>  '<li class="emoti emoti55"></li>',
        'O:)'   =>  '<li class="emoti emoti54"></li>',
        ':)'   =>  '<li class="emoti emoti00"></li>',
        '>:('   =>  '<li class="emoti emoti19"></li>',
        ':('   =>  '<li class="emoti emoti01"></li>',
        ':P'   =>  '<li class="emoti emoti14"></li>',
        '=D'   =>  '<li class="emoti emoti08"></li>',
        '>:o'   =>  '<li class="emoti emoti18"></li>',
        ':o'   =>  '<li class="emoti emoti15"></li>',
        ';)'   =>  '<li class="emoti emoti04"></li>',
        ':/'   =>  '<li class="emoti emoti03"></li>',
        ':\'('   =>  '<li class="emoti emoti05"></li>',
        '^_^'   =>  '<li class="emoti emoti18"></li>',
        'B|'   =>  '<li class="emoti emoti09"></li>',
        '<3'   =>  '<li class="emoti emoti65"></li>',
        '-_-'   =>  '<li class="emoti emoti40"></li>',
        'o.O'   =>  '<li class="emoti emoti10"></li>',
        '(y)'   =>  '<li class="emoti emoti81"></li>',
        );
    return str_replace(array_keys($icons), array_values($icons), $text);
}

//test work well
echo emotify(":) :( :P =D :o ;) :v >:( :/ :'( ^_^ 8-) B| <3 3:) O:) -_- o.O >:o :3 (y) ");

我希望如果字符串与表情符号代码的左侧或右侧连接,请不要替换它。例如:

HTTP :/ / www.google.com AAA :) {BBB {1}} 111111 22222 :)

我认为这可以通过使用preg替换(?)来帮助,非常感谢。

1 个答案:

答案 0 :(得分:0)

如果你想保留strtr的速度优势(这是翻译文字字符串的最快方法(字符串只针对所有键/值解析一次)),你可以进行三次传递。 / p>

第一遍包含用占位符替换要保护的内容。例如:

$protected = array('http://'  => '#!#0#!#',
                   'https://' => '#!#1#!#',
                   'ftp://'   => '#!#2#!#', // etc.
);
$str = strtr($str, $protected);

请注意,$protected的构建可以从array('http://', 'https://', 'ftp://', ...);

轻松实现

第二遍,你使用你的数组:

$str = strtr($str, $icons);

第三遍,你替换占位符:

$str = strtr($str, array_flip($protected));

即使您需要三次传递,结果也会比使用preg_replace快得多,后者将为每个键/值解析字符串一次。