использовать preg_replace_callback с массивом - PullRequest
0 голосов
/ 23 ноября 2018

Я знаю, что об этом спрашивали в другом месте, но я не могу найти точную ситуацию (и понять это!), Поэтому я надеюсь, что кто-то сможет помочь с кодом здесь.

Есть массивизменений, которые будут сделаны.Упрощенно это:

$title = "Tom's wife is called Tomasina";

$change_to = array(
   "Tom"        => "Fred",
   "wife"       => "girlfriend",
);

$title = preg_replace_callback('(\w+)', function( $match )use( $change_to ) {
    return $array[$match[1]];
}, $title);

Я надеюсь вернуться "Подружку Фреда зовут Томазина", но я получаю всевозможные вещи обратно в зависимости от того, как я настраиваю код - ни один из которых не работает!

Я почти уверен, что упускаю что-то ослепительно очевидное, поэтому прошу прощения, если не вижу этого!

Спасибо!

1 Ответ

0 голосов
/ 23 ноября 2018

Существует несколько проблем:

  • Использование $change_to в анонимной функции, а не $array
  • Использование разделителей регулярных выражений вокруг шаблона (например, /.../, /\w+/)
  • Если в $change_to такого элемента нет, вернуть значение соответствия, в противном случае оно будет удалено (проверку можно выполнить с помощью isset($change_to[$match[0]])).

Используйте

$title = "Tom's wife is called Tomasina";

$change_to = array(
   "Tom"        => "Fred",
   "wife"       => "girlfriend",
);

$title = preg_replace_callback('/\w+/', function( $match ) use ( $change_to ) {
    return isset($change_to[$match[0]]) ? $change_to[$match[0]] : $match[0];
}, $title);
echo $title;
// => Fred's girlfriend is called Tomasina

См. PHP-демо .

Также, если ваша строка может содержать любые буквы Unicode, используйте '/\w+/u' regex.

...