【问题标题】:Skip preg_replace if match string is not in array如果匹配字符串不在数组中,则跳过 preg_replace
【发布时间】:2016-03-07 11:32:28
【问题描述】:

我有替换字符串 ex 的函数。 :smile: 带图片标签。

function out_emoj($str)
{

    $emoj_array = array(
        "cry", "grimacing", "joy","smiley","innocent", "wink", "flushed", "slight_smile",
        "stuck_out_tongue_winking_eye", "relaxed", "crab","cat","expressionless", "pig", "rose", "cherry_blossom",
        "sunny", "cloud_snow", "coffee","tea","grin", "ring", "crown", "nerd",
        "heart_eyes", "kissing_heart", "sunglasses","scream","rage","disappointed","fearful","confused",
        "dizzy_face", "zipper_mouth", "thermometer_face","sleeping","ghost","smiley_cat","smile_cat","joy_cat",
        "heart_eyes_cat", "smirk_cat", "kissing_cat","scream_cat","crying_cat_face","pouting_cat","thumbsup","thumbsdown",
        "angel", "dancer", "kimono","heart","purple_heart","sparkling_heart","heart_decoration","snowflake",
        );
    return preg_replace("/:(.*?):/", " <img width='22' src='".base_url('assets/img/emojiones/$1.png')."' alt='$1'> ", $str);
}

我想检查匹配字符串是否在数组中,然后替换其他跳过。 例如:如果用户输入 :notfound: 函数将添加带有不存在图像的标签。我想先检查“notfound”是否在数组中。

【问题讨论】:

  • 看看:preg_replace_callback()
  • 你为什么不使用一个简单的循环?在这种情况下,预赛完全是矫枉过正。

标签: php preg-replace


【解决方案1】:

阿塔鲁斯王子,您可以将preg_replace_callback 添加到您的戈戈特武器中:

return preg_replace_callback("/:(.*?):/", function ($m) use ($emoj_array) {
    if (in_array($m[1], $emoj_array))
        return ' <img width="22" src="' . base_url('assets/img/emojiones/' . $m[1] . '.png') . '" alt="' . $m[1] . '"> ';
    return $m[0];
}, $str);

另一种方法是构建一个模式数组,映射原始数组并使用preg_replace,但效率较低,因为每个模式都会解析一次字符串。


其他方式:构建替代:

$pattern = '/:(' . implode('|', $emoj_array) . '):/';

return preg_replace($pattern, ' <img width="22" src="' . base_url('assets/img/emojiones') . '/$1.png" alt="$1"> ', $str);

【讨论】:

  • 好答案。现在我知道如果我想在函数中使用全局变量,我可以使用“use (array)”。
【解决方案2】:
function out_emoj($str)
{
    $emoj_array = array(
        "cry", "grimacing", "joy","smiley","innocent", "wink", "flushed", "slight_smile",
        "stuck_out_tongue_winking_eye", "relaxed", "crab","cat","expressionless", "pig", "rose", "cherry_blossom",
        "sunny", "cloud_snow", "coffee","tea","grin", "ring", "crown", "nerd",
        "heart_eyes", "kissing_heart", "sunglasses","scream","rage","disappointed","fearful","confused",
        "dizzy_face", "zipper_mouth", "thermometer_face","sleeping","ghost","smiley_cat","smile_cat","joy_cat",
        "heart_eyes_cat", "smirk_cat", "kissing_cat","scream_cat","crying_cat_face","pouting_cat","thumbsup","thumbsdown",
        "angel", "dancer", "kimono","heart","purple_heart","sparkling_heart","heart_decoration","snowflake",
        );

    return preg_replace_callback("/:(.*?):/",
        function($m) use ($emoj_array)
        {

            if (in_array($m[1],$emoj_array))
            {
                return " <img width='22' src='".base_url('assets/img/emojiones/'.$m[1].'.png')."' alt='{$m[1]}'> ";
            }
            else
            {
                return ':'.$m[1].':';
            }
        } 
     , $str);

}

谢谢@Casimir et Hippolyte 和@rizier123 这是我的解决方案

【讨论】:

  • str_replace 没用,因为你想要的已经在$m[1] (第一个捕获组)
  • thnx @CasimiretHippolyte
  • 完美。我将使用您的第二个版本的代码。
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多