哦,男孩,这是一个很糟糕的事。好吧,我有一个带有键值的数组中的图像数组。
$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;
}
但现在根本没有图片显示!?
答案 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;
}