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

Тема в разделе "PHP", создана пользователем Levitt, 23 фев 2013.

Модераторы: latteo
  1. Levitt

    Levitt

    Регистр.:
    20 май 2008
    Сообщения:
    358
    Симпатии:
    36
    в общем постала задача уменьшить количество вхождений слова в текст до определенного уровня, но при єтом не делать єту замену исключительно в первых троках, а рандомно по всему тексту. Переделал под свои нужды скрипт слитый с интернета, но он вышел уж очень большой. Возможно есть менее ресурсоемкий и менее знаковый способ через 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;
    }
    ?>
     
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    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($WorkArrstrtolower($word)));
        
    $DelKey array_rand($NeedWordcount($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 - получите сколько всего слов и далее прыгайте от этого числа устанавливая нужное количество повтора указанного слова.
     
    latteo и Levitt нравится это.