ああ、これはすごいです。さて、キー値を持つ配列に画像の配列があります。
$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;
}
しかし、今では画像がまったく表示されません!?