Используйте ассоциативные массивы с заменой preg


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

Кто-нибудь знает, действительно ли это не работает?

Author: Toto, 2010-01-01

3 answers

Вы хотите сделать это с ключами или ключами и значениями или просто сохранить ключи и обработать значения? В зависимости от обстоятельств, array_combine(), array_keys() и array_values() может достичь этого в сочетании.

На клавишах:

$keys = array_keys($input);
$values = array_values($input);
$result = preg_replace($pattern, $replacement, $keys);
$output = array_combine($result, $values);

О ключах и значениях:

$keys = array_keys($input);
$values = array_values($input);
$newKeys = preg_replace($pattern, $replacement, $keys);
$newValues = preg_replace($pattern, $replacement, $values);
$output = array_combine($newKeys, $newValues);

О значениях, сохраняющих ключи:

$keys = array_keys($input);
$values = array_values($input);
$result = preg_replace($pattern, $replacement, $values);
$output = array_combine($keys, $result);

Все они предполагают функцию примерно такую:

function regex_replace(array $input, $pattern, $replacement) {
  ...
  return $output;
}
 5
Author: cletus, 2010-01-01 03:16:40

Если я правильно понимаю, вы хотите:

$patterns = array_keys($input);
$replacements = array_values($input);
$output = preg_replace($patterns,$replacements,$string);
 1
Author: slebetman, 2010-01-01 03:17:36

Потратил на это довольно много времени, поэтому добавлю свой ответ

$str = "CT is right next to NY";

$list = array('CT'=>'connenticut', 'NY'=>'New York', 'ME' => 'Maine');
$list = get_json();

$pattern = array_keys($list);
$replacement = array_values($list);

foreach ($pattern as $key => $value) {
    $pattern[$key] = '/\b'.$value.'\b/i';
}

$new_str = preg_replace( $pattern,$replacement,  $str);

Убедитесь, что вы используете /разделители/для сопоставления шаблонов регулярных выражений. \b - это граница слова.

 1
Author: Hammad Khan, 2017-03-10 15:37:18