2010-08-16 3 views
1

sprintf()와 달리 sprintf()를 사용하는 경우와 달리 인수를 순서에 따라 값을 바인딩하는 경우와 달리 변수를 이름으로 바인딩 할 수있는 부분이 필요합니다. 그래서 문자열이 "Hello $name! We're please to have you visit, $name!"이라면 배열이나 무언가를 전달하여 결과 문자열을 얻을 수 있습니다.문자열에 변수의 명명 된 바인딩이 있습니까?

PDO 문과 비슷하지만 데이터베이스 쿼리가 아닌 일반 문자열에만 사용됩니다. 무엇을 사용할 수 있습니까?

답변

3

preg_replace이다 그것이 문제입니다,

$vars = array('name' => 'Joe', 'age' => 25); 
    $str = "@name is @age years old"; 
    echo preg_replace('/@(\w+)/e', '$vars["$1"]', $str); 
+0

Stereofrog - 가장 멋진 답변의 가장 멋진 사용자 이름입니다! – user151841

0

아마도 자유 변수가 자유 변수를 채우는 값이있는 문자열을 반환하는 익명 함수의 매개 변수로 바인딩되도록 anonymous functions을 사용할 수 있습니다. 클로저 내부의 extract 함수와 함께 사용하면 배열의 키가 형식 문자열에서 참조되는 변수를 평가하는 데 필요한 로컬 범위 내에서 실제 변수가됩니다.

또는 eval를 사용하여 비교적 간단한 버전은 아마이 (이 그냥 그림이 아니라 테스트 코드) :

function named_printf ($format_string, $values) { 
    extract($values); 
    $result = $format_string; 
    eval('$result = "'.$format_string.'";'); 
    return $result; 
} 

echo named_printf ('Hello $msg', array('msg'=>'World')); 

PHP의 범위 제어 메커니즘은 조금 무서운, 그래서이 있는지 확인 할 수 있습니다 그 곳곳에 변수를 누설하지 않을 것입니다. 그것은 또한 santising 입력 가치가있을거야.

+0

'eval'는 해결책이 아니다 당신의 최선의 방법이다. –

+0

동의. 그래서 첫 번째 인스턴스에서 클로저를 사용하도록 제안한 다음 OP가 printf와 같은 방식으로 일반화 된 솔루션을 원한다면 eval을 사용하여 "비교적 간단한 버전"이라고 말한 것입니다. 실제로 시스템 레벨 일반 기능을 구현하는 경우 eval을 사용할 수 있습니다. – Gian

+0

"시스템 레벨 제네릭 기능을 실제로 구현하는 경우 eval을 사용해도됩니다."라고 나는 항상 * 더 좋은 방법이 거의 없다고 동의합니다. 'eval'은 유지 보수가 어렵고 성능과 보안면에서 좋지 않습니다. –

2

PHP는 큰 따옴표로 묶은 문자열 안에 변수를 평가할 수있는 기능을 내장하고 있습니다. 배열에 배열을 "전달"할 수는 없지만 현재 변수 범위를 문자열 작성기 "함수"에 대한 입력으로 생각할 수 있습니다.

http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

$name = "Kendall Hopkins"; print "Hello {$name}!"; //Hello Kendall Hopkins! 

는 편집 :

더 유연한 솔루션은 폐쇄 속으로 추상적 인 코드에 수 있습니다. 이것은 eval에 의존하지 않으며 더 빨리 실행됩니다./e 또는 preg_replace_callback

$hello_two = function (array $params) { 
    extract($params); 
    return "Hello $name1 and $name2!"; 
} 

//Hello User and Kendall 
$hello_two(array("var1" => "User", "var2" => "Kendall")); 
+0

네, 알아요,하지만이 작업을 수행하는 기능이 필요하므로 여러 위치에서 템플릿 문자열을 다시 사용할 수 있습니다. 다른 말로하면 나는 글을 쓰는 시점에 변수들을 묶는 것을 원하지 않는다. 이 PHP 기능을 사용하면 문자열을 일회용으로 만들 수 있으며 다시 사용할 수는 없습니다. – user151841

+0

@ user151841 제 편집을보세요. –

+0

이것은 형식 문자열마다 별도의 폐쇄를 요구하는 것 같습니다. 그게 정말로 묻히고있는 것입니까? – Gian

관련 문제