Вы можете получить точное поведение, которое хотите, используя функцию strtr
:
$codedVersion = $this->getBody();
$replacementArray = array(
'$' => '_dollar',
',' => '_comma',
'(' => '_openparenthesis',
')' => '_closeparenthesis',
'[' => '_opensquarebrackets',
']' => '_closesquarebrackets',
'{' => '_opencurlybrackets',
'}' => '_closecurlybrackets'
);
$codedVersion = strtr($codedVersion, $replacementArray);
Поскольку другие ответы указывают, это также возможно сделать в одном вызове str_replace
использование array_keys
и array_values
, но помимо более простого синтаксиса между ними есть важное функциональное различие: strtr
оставит уже замененные строки без изменений (т. е. пары поиска / замены не будут мешать друг другу), и str_replace
не будет.Рассмотрим этот пример ( demo ):
$replacementArray = array(
'$' => '_dollar',
'_' => '_underscore'
);
$codedVersion = '$';
// strtr() returns string(7) "_dollar" as expected
var_dump(strtr($codedVersion, $replacementArray));
// str_replace() replaces twice, so returns string(17) "_underscoredollar"
var_dump(str_replace(array_keys($replacementArray), array_values($replacementArray), $codedVersion));
Это может очень легко вызвать странные ошибки, когда массив замены не был тщательно упорядочен, а некоторые операции множественной замены даже не выполняются.возможно с str_replace
, а возможно с strtr
.По этим причинам я бы рекомендовал использовать strtr
, если явно не требуется поведение str_replace
.