Regex: sintaxis defectuosa utilizada con preg_replace_callback?
-
06-07-2019 - |
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
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.