Ограничить число замен в строке

kabachok

Новичок
Ограничить число замен в строке

PHP:
$str='111111111111111111111111';

$str=str_replace('1','2',$str);

echo $str;
выведет 222222222....

необходимо добиться резальтата к примеру

222111111111...

Не подскажете как?
 

Andreika

"PHP for nubies" reader
[DAN]
понял.. а если очень попросите, то и вам объясню

kabachok
а стоило ли писать, что ты неправильно выразился, не написав правильную мысль?
 

kabachok

Новичок
строка может быть разной, но необходимо ограничить число замен, допустим трёх

PHP:
$str='бла бла 1 бла бла бла 1 бла 1 много бла 1 и т.п.';

$str=str_replace('1','2',$str);

echo $str;
надо чтобы заменились только первые три едичники, а те которые встретятся после не трогались
необходимо мне это для того чтобы ограничить чисто смайликов в посте
 

WP

^_^
Да какие проблемы сделать while + strpos + substr_replace? Пара строчек.
 

kabachok

Новичок
preg_replace не так как надо работает

PHP:
function smiles($msg) {
$max='3';
$code[]='/\:\)/'; $repl[]='<img src="smiles/01.gif" alt=""/>';
$code[]='/\:\(/'; $repl[]='<img src="smiles/02.gif" alt=""/>';

$msg=preg_replace($code,$repl,$msg,$max);

return $msg;
}
если сообщение содержит к примеру по 3 смайла :( и :) заменятся все а не первые три
 

WP

^_^
PHP:
/* 0xEngine/core/bbcode.php */
   $GLOBALS['smiles1'] = array();
   $GLOBALS['smiles2'] = 0;
   $this->result = preg_replace_callback('~:(\w+):~i',
create_function('$a','
if ($GLOBALS[\'smiles1\'][strtolower($a[1])] < 3 and $GLOBALS[\'smiles2\'] < 10 and file_exists(\'./images/smiles/\'.$a[1].\'.gif\'))
{
 if (!isset($GLOBALS[\'smiles1\'][strtolower($a[1])])) {$GLOBALS[\'smiles1\'][strtolower($a[3])] = 0;}
 $GLOBALS[\'smiles1\'][strtolower($a[1])]++; $GLOBALS[\'smiles2\']++; return \'<img src="/images/smiles/\'.$a[1].\'.gif" border=0>\';
}
else {return $a[0];}'),$this->result);
   unset($GLOBALS['smiles1'],$GLOBALS['smiles2']);
Т.е. просто замены подсчитываем. И к тому же посчитываем число вхождений каждой подстроки.
 

Andreika

"PHP for nubies" reader
када-то давно я подобное через preg_replace_callback заменял.. но в моем случае без нее и так нельзя было обойтись
 

kabachok

Новичок
вот из последнего примера вообще ничего не понял :)
остановлюсь пока на таком варианте
PHP:
function smiles($msg) { 
$max='1'; 
$code[]='/\:\)/'; $repl[]='<img src="smiles/01.gif" alt=""/>'; 
$code[]='/\:\(/'; $repl[]='<img src="smiles/02.gif" alt=""/>'; 

$msg=preg_replace($code,$repl,$msg,$max); 

return $msg; 
}
т.е. каждого смайла по одному
 
Сверху