строка заменяет php - одно слово для нескольких слов - PullRequest
0 голосов
/ 01 декабря 2010

Привет всем, мне нужен особый тип замены строк в php. Мне нужно заменить слово двумя другими словами.

Например: в строке «Привет, мама, привет, папа» мне нужно автоматически заменить слово «привет» двумя другими, например, «Мэри» и «Джон». Таким образом, если встречается только один «Привет», его заменяют только на «Мэри», но если их несколько, он использует все ассоциации слов.

Итак, еще одно слово заменяет в зависимости от того, сколько раз встречается слово. Спасибо всем, кто может мне помочь!

Ответы [ 4 ]

3 голосов
/ 01 декабря 2010

preg_replace_callback позволяет контролировать каждую замену.

0 голосов
/ 01 декабря 2010

Я не уверен, есть ли действительно простой способ сделать это, но взгляните на этот фрагмент кода, который я только что написал. Это должно помочь вам:)

<?php
class myReplace{
    public $replacements = array();
    protected $counter = 0;

    public function __construct($replacements) {
      // fill the array with replacements
      $this->replacements = $replacements;
    }

    public function test($matches) {
      // if you want you could do something funky to the matches array here

      // if the key does not exists we are gonna start from the first 
      // array element again.
      if(!array_key_exists($this->counter, $this->replacements)) {
        $this->counter = 0;
      }

      // this will return your replacement.
      return $this->replacements[$this->counter++];
    }
}

// Instantiate your class here, and insert all your replacements in sequence
$obj = new myReplace(array('a', 'b'));

// Lets start the replacement :)
echo preg_replace_callback(
    "/hi/i",
    array($obj, 'test'),
    "Hi mom, hi dad, hi son, hi someone"        
);
?>

Этот код приведет к: мама, б папа, сын, б кто-то

0 голосов
/ 01 декабря 2010

preg_replace_callback - это один из способов, другой - использовать параметры $ limit и $ count для preg_replace (см. manpage )

$str = "hi foo hi bar hi baz hi quux";
$repl = array('uno', 'dos', 'tres');

do{
    $str = preg_replace('~hi~', $repl[0], $str, 1, $count);
    $repl[] = array_shift($repl); // rotate the array
} while($count > 0);    
0 голосов
/ 01 декабря 2010

Вы можете сделать это с помощью нескольких вызовов preg_replace, указав ограничение 1 для каждого вызова:

$string = "Hi mom, hi dad";

preg_replace('/hi/i', 'mary', $str, 1); // "mary mom, hi dad"
preg_replace('/hi/i', 'john', $str, 1); // "mary mom, john dad"

Вы можете обобщить это следующим образом.Требуется тема, шаблон и 1 или более замещающих слов.

function replace_each($subject, $pattern, $replacement) {

  $count = 0;
  for ($i = 2; $i < func_num_args(); ++$i) {
    $replacement = func_get_arg($i);
    $subject = preg_replace($pattern, $replacement, $subject, 1, $count);
    if (!$count)
      // no more matches
      break;
  }
  return $subject;
}

$string = preg_replace_each("Hi mom, hi dad", "/hi/i", "mary", "john");

echo $string; // "mary mom, john dad"
...