Вы можете использовать простой текст в ключах ассоциативного массива, которые вы будете использовать для создания динамических шаблонов регулярных выражений, и использовать preg_replace_callback
для замены найденных значений заменами за один раз.
$internal_message = 'Hey, this is awesome!';
$words = array(
'wesome' => 'wful',
'wful' => 'wesome',
'this' => 'that',
'that' => 'this'
);
$rx = '~(?:' . implode("|", array_keys($words)) . ')\b~';
echo "$rx\n";
$message = preg_replace_callback($rx, function($m) use ($words) {
return isset($words[$m[0]]) ? $words[$m[0]] : $m[0];
}, $internal_message);
echo $message;
// => Hey, that is awful!
См. Демонстрационную версию PHP .
Регулярное выражение:
~(?:wesome|wful|this|that)\b~
(?:wesome|wful|this|that)
- это группа без захвата, которая соответствуетлюбое из значений внутри, и \b
является границей слова, непотребляющим шаблоном, который гарантирует отсутствие буквы, цифры или _
после суффикса.
preg_replace_callback
анализирует строку один рази когда происходит совпадение, оно передается анонимной функции (function($m)
) вместе с массивом $words
(use ($words)
), а если массив $words
содержит найденный ключ (isset($words[$m[0]])
), соответствующее значениевозвращается ($words[$m[0]]
) или найденное совпадение возвращается в противном случае ($m[0]
).