Замена PHP переменной - PullRequest
       16

Замена PHP переменной

4 голосов
/ 09 июня 2009

Есть ли функция, которая заменяет параметры в строке? Примерно так:

Код:

$format_str = "My name is %name."; /* this was set in a 
                                      configuration file - config.php */

$str = xprintf($format_str, array('name' => 'Joe', 'age' => 150)); 
              /* above is somewhere in main code */

Ожидаемое значение $ str после операции:

My name is Joe.

Обновление: я знаю о sprintf. Но этого было бы недостаточно в этом случае. Я изменил код, чтобы показать, в чем разница.

Ответы [ 8 ]

10 голосов
/ 09 июня 2009

похоже на strtr - это встроенная функция, которая может делать то же самое. (получил это от прохождения через код друпала).

>> $format_str = "My name is %name.";
My name is %name.
>> strtr($format_str, array('%name' => 'Joe', '%age' => 150))
My name is Joe.
3 голосов
/ 09 июня 2009

Вы можете использовать это:

function xprintf($str, $array, $chr = '%') {

   foreach ($array as &$key => $val) {
       $key = $chr . $key;
   }

   return strtr($str, $array);
}

$str = xprintf('My name is %name', array('name' => 'Joe'));
2 голосов
/ 09 июня 2009

Вы имеете в виду sprintf () ?

$ str = sprintf («Меня зовут% s.», «Джо»);

0 голосов
/ 09 июня 2009

Вы ищете vsprintf . http://us2.php.net/vsprintf

Позволяет передавать массив аргументов, как вы указали.

0 голосов
/ 09 июня 2009

Эта функция, «карта» (и замена), является частью моей системы веб-приложений:

function replace($search, $replace, $mixed)
{
    if (is_string($mixed)) {
        return @str_replace($search, $replace, $mixed);
    } else if (is_array($mixed)) {
        foreach ($mixed as $k => $v) {
            $mixed[$k] = replace($search, $replace, $v);
        }
        return $mixed;
    } else {
        return $mixed;
    }
}


function map($a, $contents, $case_sensitive=false)
{
    if (!is_array($a)) {
        return $contents;
    }
    if (!$case_sensitive) {
        $a = array_change_key_case($a);
    }
    $s = array();
    $r = array();
    foreach ($a as $k => $v) {
        if (is_scalar($v) || empty($v)) {
            $s[] = "{".$k."}";
            $r[] = $v;
        }
    }
    if (!$case_sensitive) {
        $contents = preg_replace_mixed('/{([-_ =,.\/\'"A-Za-z0-9]+)}/ei', "'{'.strtolower('\\1').'}'", $contents);
    }
    return replace($s, $r, $contents);
}

Очень хорошо справляется. Укажите любую строку с именами переменных в квадратных скобках, и это поможет.

Синтаксис другой, но может быть изменен для ваших целей:

$str = map(array('name' => 'Joe'), 'My name is {name}');

Я предпочитаю его синтаксису%.

0 голосов
/ 09 июня 2009

PHP может извлекать значения из массива без использования sprintf ():

$data = array('name' => 'Joe', 'age' => 150);
print "My name is $data[name], my age is $data[age].";
0 голосов
/ 09 июня 2009

Вы всегда можете использовать eval ... (задыхаясь!)

$myStr = 'Hi my name is $name. I\'m $age years old.';
$myVars = array("name" => "Joe", "age" => 6);
$parsed = parseString($myStr, $myVars);

function parseString($str, $vars) {
    extract($vars);
    return eval('return "' . addslashes($str) . '";');
}

До того, как кто-либо начнет раздражаться по поводу использования extract AND eval, пока у вас есть контроль над строкой входного шаблона, я не могу понять, как это может быть проблемой безопасности.

0 голосов
/ 09 июня 2009

Попробуйте дать printf () водоворот. На этом сайте есть много примеров использования массивов с printf.

printf("My name is %s", "Joe"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...