Pregunta

Tomé prestado el código de este enlace PHP regex templating - encuentra todo ocurrencias de {{var}} para implementar un medio de aplicar valores a plantillas fiies. Esto utiliza la función preg_replace_callback ()

mi método preferido para nombrar es name1.name2.name3 = value, en lugar de name1_name2_name3 = value, pero la expresión regular que estoy usando parece tener un problema.

Este no funciona.

archivo de plantilla

.aclass{
  font-width:{{newsflash.font.width}};
}

.ini valores

newsflash.font.width=8px

expresión regular utilizada

'!\{\{(\w+).+\.\w+\}\}!'

salida de print_r ($ coincide)

Array
(
  [0] => {{newsflash.font.width}}
  [1] => newsflash
)

la sustitución es incorrecta porque $ coincide [1] es la clave clave incorrecta.

.aclass{
  font-width:;
}

Sospecho que hay bibliotecas que ya ofrecen esta funcionalidad y me encantaría saber acerca de ellas, pero aún quiero saber la falla con la expresión regular.

El código completo con la expresión regular defectuosa está debajo.

$inputFileName = 'templateVars.css';
$outputFileName = 'templateVals.css';
$varsFileName = 'variables.ini';

$ini_array = parse_ini_file($varsFileName);
$matchesArray = array();

function replace_value($matches) {
  global $ini_array;
  global $matchesArray;
  print "<pre>";
  print_r($matches);
  print "</pre>";
  return $ini_array[$matches[1]];
}


$inputFileVar = file_get_contents($inputFileName);

print "<pre>";
print_r($ini_array);
print "</pre>";


print "<pre>";
print $inputFileVar;
print "</pre>";

$outFileVar = preg_replace_callback('!\{\{(\w+).+\.\w+\}\}!', 'replace_value', $inputFileVar);

print "<pre>";
print $outFileVar;
print "</pre>";

print "<pre>";
print $matchesArray;
print "</pre>";

Plantilla para que coincida

.aclass{
  font-width:{{newsflash.font.width}};
  color:{{newsflash.font.color}}
}

Contenido del archivo .ini

newsflash.font.width=8px
newsflash.font.color=red
¿Fue útil?

Solución

el carácter . no es parte de \ w ; y su . + (fuera de los grupos de agrupación) coincidirá con cualquier cadena no vacía (. es un comodín). Por lo tanto, $ coincide [1] = newsflash es correcto.

¿Qué quieres que sea el $ coincide [1] ? Esto no está claro en su pregunta, lo siento.

Otros consejos

!\{\{(\w[\.\w]*)\}\};?!

esta expresión regular parece coincidir bien con sus plantillas.

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