Pregunta

Estoy usando Smarty y PHP. Si tengo una plantilla (ya sea como un archivo o como una cadena), ¿hay alguna forma de que Smarty analice ese archivo / cadena y devuelva una matriz con todas las variables inteligentes en esa plantilla?

por ejemplo: quiero algo como esto:

$mystring = "Hello {$name}. How are you on this fine {$dayofweek} morning";
$vars = $smarty->magically_parse( $string );
// $vars should now be array( "name", "dayofweek" );

La razón por la que quiero hacer esto es porque quiero que los usuarios puedan ingresar plantillas ellos mismos y luego completarlas en una fecha posterior. Por lo tanto, necesito poder obtener una lista de las variables que están en estas plantillas.

Supongamos que solo estoy haciendo variables simples (por ejemplo: no " {$ object.method} " o " {$ varaible | function} "), y que no estoy incluyendo ninguna otra plantilla .

¿Fue útil?

Solución 2

Parece que no hay una forma incorporada de hacer esto.

Otros consejos

Si necesita variables ocultas en cosas como {if $ var% 2} iría con este tipo de código:

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

Si también quieres atrapar cosas como esa: {if $ var! = $ var2} una mejor versión sigue

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);
}

Normalmente estoy en contra de las expresiones regulares, pero esto me parece un caso válido. Puede usar preg_match_all () para hacer eso (si solo desea variables como $ {this} ):

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

Me doy cuenta de que este hilo es antiguo, pero esta es la solución integrada.

Creo que lo que está buscando es la consola de depuración .

Esta consola muestra todas las variables utilizadas dentro de las plantillas involucradas en su página web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top