Levitt
Профессор
- Регистрация
- 20 Май 2008
- Сообщения
- 361
- Реакции
- 43
- Автор темы
- #1
в общем постала задача уменьшить количество вхождений слова в текст до определенного уровня, но при єтом не делать єту замену исключительно в первых троках, а рандомно по всему тексту. Переделал под свои нужды скрипт слитый с интернета, но он вышел уж очень большой. Возможно есть менее ресурсоемкий и менее знаковый способ через preg_replace_callback???
Вот моя попытка с дофига буквами
Вот моя попытка с дофига буквами
PHP:
<?
$p = 'I got pizza and shat up pizza llot then i go pizza and drink it with pizza but pizza was so large than i off this pizza okok okok ko kosadla kos kaofk so kfosa fkosfk os kfosfk osfk os fkosf koas fk kosk oa fosk foko ak so fkasf ko';
$vseslova=str_word_count($p, 0);
$nugn_kol=ceil($vseslova*round(3,5)/100);
//kolichestvo slov-fraz kotoroe vhodit v limit 1-3%
//echo $nugn_kol.'<hr>';
if (preg_match_all('/pizza/',$p, $matches))
{
$kol_sovpad=count($matches[0]);
if($kol_sovpad>$nugn_kol)
{
$invert_nugn_kol=$kol_sovpad-$nugn_kol;
}
else
{
$invert_nugn_kol=$kol_sovpad;
}
//echo $invert_nugn_kol; echo '<hr>';
$rand = array_rand($matches[0], $nugn_kol);
//print_r($rand); echo '<hr>';
foreach($rand as $rand_key)
{
if ($rand_key==0)
continue;
$p=replace_num($matches[0][$rand_key], "XXX",$p, $rand_key+1);
}
}
$p=preg_replace('|XXX(.*?\s)|','',$p);
echo $p;
###
function replace_num($from, $to, $string,$num)
{
$pos=-1;
$i=0;
while($pos!==false && $i<$num)
{
$pos = strpos($string, $from, $pos+1);
$i++;
}
if ($pos)
{
return substr($string, 0, $pos) . str_replace($from, $to, substr($string,$pos, strlen($from))) . substr($string, $pos) ;
}
return $string;
}
?>