Заменить кучу символов в PHP - PullRequest
1 голос
/ 14 марта 2012

У меня есть строка с кучей специальных символов / символов, и я хочу заменить их некоторыми другими строками. Например, $ должно стать _dollar, , должно стать _comma, ( _openparenthesis, ) _closeparenthesis и т. Д.

Это лучший подход, или я могу заменить их всех "одним движением" * ( есть больше символов, я не поместил их всех здесь) ?

public function replaceSymbols() {
    $codedVersion = $this->getBody();

    $replacementArray = array(
        '$' => '_dollar',
        ',' => '_comma',
        '(' => '_openparenthesis',
        ')' => '_closeparenthesis',
        '[' => '_opensquarebrackets',
        ']' => '_closesquarebrackets',
        '{' => '_opencurlybrackets',
        '}' => '_closecurlybrackets'
    );

    foreach($replacementArray as $key => $value)
        $codedVersion = str_replace($key, $value, $codedVersion);

    return $codedVersion;
}

Ответы [ 5 ]

3 голосов
/ 14 марта 2012

Вы можете получить точное поведение, которое хотите, используя функцию 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.

3 голосов
/ 14 марта 2012

str_replace - лучший метод для этого, вы можете просто передать 2 массива как 2 параметра, так что вам нужно вызвать его только один раз ...

$codedVersion = str_replace(array('$', ','), array('_dollar', '_comma'), $codedVersion);
1 голос
/ 14 марта 2012

Это должно работать:

public function replaceSymbols() {
    $codedVersion = $this->getBody();

    $replacementArray = array(
        '$' => '_dollar',
        ',' => '_comma',
        '(' => '_openparenthesis',
        ')' => '_closeparenthesis',
        '[' => '_opensquarebrackets',
        ']' => '_closesquarebrackets',
        '{' => '_opencurlybrackets',
        '}' => '_closecurlybrackets'
    );

    $codedVersion = str_replace(array_keys($replacementArray), array_values($replacementArray), $codedVersion);

    return $codedVersion;
}
1 голос
/ 14 марта 2012

Вы можете передать str_replace два массива - один из совпадений, другой из замен. Вы можете использовать array_keys и array_values, чтобы получить их от вашего $replacementArray:

$codedVersion = str_replace(array_keys($replacementArray), array_values($replacementArray), $codedVersion);
1 голос
/ 14 марта 2012

Я бы удалил цикл и сделал бы

return str_replace(array_keys($replacementArray), array_values($replacementArray), $codedVersion);

Это выполнит операцию замены и вернет результат за один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...