带有limit参数的str_replace

时间:2013-08-06 04:17:04

标签: php arrays replace limit

哦,男孩,这是一个很糟糕的事。好吧,我有一个带有键值的数组中的图像数组。

$smiles = array( ':)' => 'http://www.example.com/happy.png', ':(' => 'http://www.example.com/sad.png' );

然后我有一个文字输入:that's sad to hear :(, but also great that you go a new dog :)

我可以解析整个数组并使用str_replace替换,但我希望每条消息限制为4个表情符号。

我原来的(无限制):

function addSmilies($text){
    global $smilies;

    foreach($smilies as $key => $val)
    {
        $search[] = $key;
        $replace[] = '<img src="' . $val . '" alt="' . $key . '" />';
    }

    $text = str_replace( $search, $replace, $text );
    return $text;
}

我知道你可以使用preg_replace,这有一个限制,但我对正则表达式很可怕,无法让他们做我想做的事。所以回到我的问题。是否有一个str_replace,其限制适用于数组,还是应该坚持使用preg_replace?

更新:我考虑剥离:)和:(首先我用实际标记替换。

function addSmilies($text){
    global $smilies;

    foreach($smilies as $key => $val)
    {
        $search[] = $key;
        $replace[] = '<img src="' . $val . '" alt="' . $key . '" />';
    }

    $limit = 4;
    $n = 1;

    for($i=0; $i<count($search); $i++)
    {
        if($n >= $limit)
            break;

        if(strpos($text, $search[$i]) === false)
            continue;

        $tis = substr_count( $text , $search[$i] ); //times in string
        $isOver = ( $n + $tis > $limit) ? true : false;
        $count = $isOver ? ($limit - $n) : $tis;

        $f = 0;
        while (($offset = strpos($text, $search[$i])) !== false)
        {
            if($f > $count)
                $text = substr_replace($text, "", $offset, strlen($search[$i]));
            $f++;
        }

        $n += $tis;
    }

    $text = str_replace( $search, $replace, $text );

    return $text;
}

但现在根本没有图片显示!?

1 个答案:

答案 0 :(得分:1)

这是一个使用preg_split的稍微清晰的函数,它包含一个限制参数(由于子集的性质,你必须加1)。基本上,您使用正则表达式拆分字符串,确定导致字符串拆分的模式,然后在将字符串连接在一起时替换前四个模式。它使功能更加清晰。

function addSmilies($text){
    $smilies = array( ':)' => 'http://www.site.com/happy.png', ':(' => 'http://www.site.com/sad.png' );

    foreach($smilies as $key => $val)
    {
        $search[] = $key;
        $replace[] = '<img src="' . $val . '" alt="' . $key . '" />';
    }

    $limit = 4; //Number of keys to replace
    $return = preg_split('/(\:\)|\:\()/',$text,$limit+1,PREG_SPLIT_DELIM_CAPTURE);

    //Concat string back together
    $newstring = "";
    foreach($return as $piece) {
        //Add more if statements if you need more keys
        if(strcmp($piece,$search[0])==0) {
            $piece = $replace[0];
        }
        if(strcmp($piece,$search[1])==0) {
            $piece = $replace[1];
        }
        $newstring = $newstring . $piece;
    }
    return $newstring;
}