str_replace неожиданное поведение - PullRequest
0 голосов
/ 24 января 2012

Я пишу тривиальную систему шаблонов для запуска динамических запросов на сервере.

В моем классе шаблонов изначально был следующий код:

$output = file_get_contents($this->file);

foreach ($this->values as $key => $value) {
    $tagToReplace = "{$key}";
    $output = str_replace($tagToReplace, $value, $output);
}

Я заметил, что строки не были заменены, как я ожидал (символы '{}' все еще оставались в выводе).

Затем я изменил «оскорбительную» строку на:

$tagToReplace = '{'."$key".'}';

Затем он работал как ожидалось. Почему это изменение было необходимо? Имеет ли "{" в интерпретируемой строке особое значение в PHP?

Ответы [ 2 ]

6 голосов
/ 24 января 2012

Да.При использовании двойных кавычек "{$key}" и "$key" одинаковы.Обычно это делается для того, чтобы вы могли раскрыть более сложные переменные, такие как "My name is: {$user['name']}".

. Вы можете использовать одинарные кавычки (как у вас есть), экранировать фигурные скобки - "\{$key\}" - или обернуть переменную дважды: "{{$key}}".

Подробнее здесь: http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

1 голос
/ 24 января 2012

Да.Это помогает разрешать имена переменных.Взгляните на этот вопрос .

{ и } можно использовать следующим образом:

$test = "something {$foo->awesome} value.";

Кстати, вы можете еще больше улучшить свой кодиспользуя следующее (и таким образом избегая ситуации, в которой вы сейчас находитесь):

$output = file_get_contents($this->file);
$output = str_replace(array_keys($this->values), $this->values, $output);
...