Поскольку str_replace()
совпадает с «: Name» в «: Name: Name_en», я хочу совместить результаты только для всего слова. Из-за этого я хотел переключиться на preg_replace()
.
$str = ":Name :Name_en"; echo $str . chr(10); $str = preg_replace('/\b' . ':Name' . '\b/i', '"Test"', $str); echo $str;
Но это не работает из-за толстой кишки. Никакой замены не происходит. Как будет выглядеть RegExp?
\b
– граница слова. Но я думаю, что двоеточие не принадлежит к такой границе слова.
Вам не нужна граница слова в начале строки:
$str = preg_replace('/:Name\b/i', '"Test"', $str);
Если вы используете PHP 5+, вы все равно можете использовать str_replace.
$str = ":Name :Name_en"; echo $str . chr(10); // The final int limits the function to a single replace. $str = str_replace(':Name', '"Test"', $str, 1); echo $str;
Если вы хотите заменить несколько ключевых слов, которые являются ассоциативными, что-то вроде словаря или заполнителей, вы можете использовать это в соответствии с вашим шаблоном регулярного выражения:
$words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow"); $source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ , _no_match_"; echo (preg_replace_callback("/\b_(\w*)_\b/", function($match) use ($words) { if(isset($words[$match[0]])){ return ($words[$match[0]]);}else{ return($match[0]);}}, $source));
Возврат: Привет! My Animal – кошка, и она говорит, что MEooow, _no_match_
Обратите внимание, что, хотя «_no_match_» не имеет перевода, он будет соответствовать во время регулярного выражения, но сохранит его ключ.