2009-10-27 4 views
2

Smarty와 PHP를 사용하고 있습니다. (파일 또는 문자열로) 템플릿이있는 경우 해당 파일/문자열을 구문 분석하고 해당 템플릿의 모든 멋진 변수가 포함 된 배열을 반환 할 수있는 방법이 있습니까?PHP Smarty - 템플릿의 모든 변수 목록 가져 오기?

는 예컨대 : 나는 이런 식으로 뭔가를 원하는 :

I 사용자가 템플릿 스스로를 입력 한 다음 나중에 그들을 기입 할 수 있도록하려는 때문에
$mystring = "Hello {$name}. How are you on this fine {$dayofweek} morning"; 
$vars = $smarty->magically_parse($string); 
// $vars should now be array("name", "dayofweek"); 

나는이 작업을 수행 할 수있는 이유입니다. 따라서이 템플릿에있는 변수의 목록을 가져올 수 있어야합니다.

간단한 변수 만 사용한다고 가정합니다 (예 : '{$ object.method}'또는 '{$ varaible | function}'없음). 다른 템플릿을 포함하지 않습니다.

+0

http://stackoverflow.com/questions/716916/print-all-variables-available-in-a-smarty-template – Lexib0y

답변

3

이렇게 할 수있는 방법이없는 것처럼 보입니다.

+0

http : // stackoverflow.com/questions/716916/print-all-variables-smarty-template에서 사용 가능 // 매개 변수를 지정하지 않으면 할당 된 모든 변수의 배열이 반환됩니다. $ all_tpl_vars = $ smarty-> getTemplateVars(); – Lexib0y

2

일반적으로 정규 표현식에 위배됩니다. 그러나 이것은 유효한 사례입니다. (만 같은 변수를 원하는 경우에) 당신은 그렇게 preg_match_all()을 사용할 수

preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER); 
$variableNames = $matches[1]; 
+2

참고 : (1) Smarty 변수는 $ {var}이 아닌 {$ var}입니다. (2)'$ matches'는 배열의 배열이 될 것이므로 전체 일치를 액세스하려면'$ matches [0]'을 반복해야합니다. (3)'{'와'}'의 내용을 괄호로 묶은 다음,'$ matches [1]'을 사용하여 접근하는 것이 더 쉽습니다. –

+0

@Ferdinand : Thx, 업데이트 된 답변. – soulmerge

+0

$ variableNames = $ matches [1]; 할 수 있습니다. . 당신이하고있는 것처럼 결과를 반복하고 싶다면, 내가 생각하기에 PREG_SET_ORDER 플래그를 사용해야한다. –

0

나는 debugging console 당신이 찾고있는 무슨 생각합니다.

이 콘솔에는 웹 페이지와 관련된 템플릿에서 사용 된 모든 변수가 표시됩니다.

4

당신이 {if $var%2} 같은 것들에 숨겨진 변수가 필요하면 내가 이런 종류의 코드와 함께 가고 싶어요 : 당신은 또한 같은 것들을 잡아하려면

preg_match_all('`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`', $string, $result); 
$vars = $result[1]; 

: {if $var != $var2} 더 나은 버전은

function getSmartyVars($string){ 
    // regexp 
    $fullPattern = '`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`'; 
    $separateVars = '`[^\\$]*\\$([a-zA-Z0-9]+)`'; 

    $smartyVars = array(); 
    // We start by extracting all the {} with var embedded 
    if(!preg_match_all($fullPattern, $string, $results)){ 
    return $smartyVars; 
    } 
    // Then we extract all smarty variables 
    foreach($results[0] AS $result){ 
    if(preg_match_all($separateVars, $result, $matches)){ 
     $smartyVars = array_merge($smartyVars, $matches[1]); 
    } 
    } 
    return array_unique($smartyVars); 
} 
다음
+0

정규식을 사용하여 html, smarty 또는 기타 소스 코드를 "구문 분석"하지 않는 것이 좋습니다. 예를 들어 숨겨진 변수를 잘못 잡아낼 것입니다. 우리가하는 모든 일이 현명해야만하는 것은 아닙니다. – enrey

1
{debug} 

이 스레드는 오래된 것으로 알고 있지만 기본 제공되는 솔루션입니다.