PHP preg_replace_callback с несколькими параметрами - PullRequest
0 голосов
/ 06 октября 2011

Я хочу заменить регулярное выражение, но я не хочу делать это каждый раз, когда он найден. Я думаю, что preg_replace_callback - это то, что мне нужно использовать, и просто делаю там произвольную проверку, но я не могу понять, как передать функции обратного вызова несколько параметров. В конечном итоге мне понадобится больше двух, но если я смогу получить две работы, я, вероятно, смогу получить больше работы.

Например, я хочу сделать замену 50% времени, а в остальное время я просто верну то, что было найдено. Вот пара функций, с которыми я работал, но просто не могу их исправить.

function pick_one($matches, $random) {
  $choices = explode('|', $matches[1]);
  return $random . $choices[array_rand($choices)];
}

function doSpin($content) {

 $call = array_map("pick_one", 50);
  return preg_replace_callback('!\[%(.*?)%\]!', $call, $content); 
/*  return preg_replace_callback('!\[%(.*?)%\]!', 'pick_one($1, 50)', $content);  */
}

$content = 'This [%should|ought|would|could%] make it much [%more convenient|faster|easier%] and help reduce duplicate content.';

echo doSpin($content).'<br/>';

Спасибо Аллен

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Вы не можете напрямую передать ему несколько параметров. Однако вы могли бы вместо этого сделать функцию методом класса, а затем создать экземпляр класса, для которого установлены свойства-члены со значениями, которые вы хотите сделать доступными для функции (например, $random).

0 голосов
/ 06 октября 2011
<?php

function pick_one($groups) {

 // half of the time, return all options
  if (rand(0,1) == 1) {
    return $groups[1];
  };

  // the other half of the time, return one random option
  $choices = explode('|', $groups[1]);
  return $choices[array_rand($choices)];

}

function doSpin($content) {

  return preg_replace_callback('!\[%(.*?)%\]!', 'pick_one', $content); 

}

$content = 'This [%should|ought|would|could%] make it much [%more convenient|faster|easier%] and help reduce duplicate content.';

echo doSpin($content).'<br/>';
...