1

ああ、これはすごいです。さて、キー値を持つ配列に画像の配列があります。

$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;
}

しかし、今では画像がまったく表示されません!?

4

1 に答える 1

1

これは、制限パラメーターを含むpreg_splitを使用した少しクリーンな関数です (サブセットの性質上、1 を追加する必要があります)。基本的には、正規表現を使用して文字列を分割し、文字列が分割された原因となったパターンを特定し、文字列を連結しながら最初の 4 つのパターンを置き換えます。これにより、よりクリーンな機能が得られます。

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;
}
于 2013-08-06T05:34:02.063 に答える