рандомная замена лимитированого количества вхождения?

Levitt

Профессор
Регистрация
20 Май 2008
Сообщения
361
Реакции
43
в общем постала задача уменьшить количество вхождений слова в текст до определенного уровня, но при єтом не делать єту замену исключительно в первых троках, а рандомно по всему тексту. Переделал под свои нужды скрипт слитый с интернета, но он вышел уж очень большой. Возможно есть менее ресурсоемкий и менее знаковый способ через 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;
}
?>
 
PHP:
<?php
$str = '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';
$word = 'Pizza';
$n = 2;
 
function ReplaceInStr($str, $word, $n)
{
    $MainArr = explode(' ', $str);
    $WorkArr = array_map('strtolower', $MainArr);
    $NeedWord = array_flip(array_keys($WorkArr, strtolower($word)));
    $DelKey = array_rand($NeedWord, count($NeedWord) - $n);
 
    if (is_array($DelKey))
        foreach ($DelKey as $val)
            unset($MainArr[$val]);
 
    return implode(' ', $MainArr);
}
 
echo ReplaceInStr($str, $word, $n);
 
?>

Проблемы могут возникнуть в strtolower при urf-8 и кирилике.
Так же избегайте preg функций...

$nugn_kol=ceil($vseslova*round(3,5)/100);
Это что ? round(3,5) вы в курсе что такое round ? o_O
То что я написал оставляет указанное количество слов... Вам как я понимаю нужное процентное соотношение оставить... Думаю доработаете код...

Перед $MainArr = explode(' ', $str); делайте str_word_count - получите сколько всего слов и далее прыгайте от этого числа устанавливая нужное количество повтора указанного слова.
 
Назад
Сверху