Pregunta

Necesito leer una cadena, detectar una {VAR}, y luego hacer un file_get_contents ( 'VAR.php') en lugar de {VAR}. El "VAR" puede tener cualquier nombre, como prueba o formulario de contacto, etc. No quiero saber lo que está VAR - no se debe hacer una condición rígida, pero sólo ver una etiqueta alfanumérica mayúscula rodeada llaves y sólo hacer una file_get_contents () para cargarlo.

Sé que necesito para usar preg_match y preg_replace, pero estoy tropezando a través de las expresiones regulares en esto.

¿Cómo es esto útil? Es útil para enganchar WordPress.

¿Fue útil?

Solución

Orion anterior tiene una solución correcta, pero en realidad no es necesario el uso de una función de devolución de llamada en su caso sencillo.

Si se asume que los nombres de archivo son A-Z + guiones se puede hacer en línea utilizando 1 / e indicador de PHP en la expresión regular:

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

Esto va a reemplazar cualquier instancia de {VAR} con el contenido de VAR.html. Se podría prefijar un camino en el segundo mandato si necesita especificar un directorio en particular.

Existen las mismas preocupaciones de seguridad vagas como se indicó anteriormente, pero no puedo pensar en nada específico.

Otros consejos

Se tendrá que hacer una serie de cosas. Estoy asumiendo que puede hacer el trabajo de campo para obtener los datos de página que desea procesar previamente en una cadena.

  1. En primer lugar, debes contar con la expresión regular para que coincida correctamente. Eso debería ser bastante fácil con algo como /{\w+}/.

  2. A continuación, tendrá que utilizar todas las banderas a preg_match para obtener la posición de apoyo en los datos de la página. Este desplazamiento permitirá que se divide la cadena en el antes, a juego, y después de piezas del partido.

  3. Una vez que tenga las 3 partes, tendrá que ejecutar las necesidades de inclusión, y pegarlas de nuevo juntos.

  4. Lather, enjuague, repita.

  5. Pare cuando no encuentre más variables.

Esto no es muy eficiente, y hay probablemente mejores maneras. Es posible que desee considerar hacer una preg_split lugar, la división en /[{}]/. No importa cómo se mire usted está asumiendo que usted puede confiar en sus datos de entrada, y esto va a simplificar todo el proceso mucho más. Para hacer esto, yo estaba a cabo el código de este modo:

  1. Tome su contenido, que se dividió así: $parts = preg_split('/[{}]/', $page_string);

  2. Escribir una función recursiva sobre las partes con los siguientes criterios:

    • Halt cuando la longitud de arg es <3
    • Si no, devolver una nueva matriz compuesta por
    • $ arg [0]. load_data ($ arg [1]). $ Arg [2]
    • más lo que queda en $ argv [3 ...]
  3. Ejecutar la función de más de $ partes.

Puede hacerlo sin expresiones regulares (Dios no lo quiera), algo como:

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}

De la parte superior de mi cabeza, desea que esta:

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

Ahora voy a explicar la expresión regular

 \{([-A-Z]+)\}
  • El \{ y \} simplemente dicen que para que coincida con las llaves. Se necesitan las barras, como { y } son caracteres especiales, por lo que necesita escapar.
  • El ( y ) crean una agrupación. Básicamente esto le permite extraer determinadas partes del partido. Yo lo uso en la función anterior para simplemente igualar las cosas dentro de las llaves, sin juego los propios aparatos. Si yo no hice esto, a continuación, que había necesidad de despojar a la { y } fuera del partido, lo que sería molesto
  • El [-A-Z] dice "coincide con cualquier carácter en mayúscula, o una -
  • El + después de la [-A-Z] significa que necesitamos tener al menos 1 carácter, pero podemos tener hasta cualquier número.

En términos comparativos, de expresiones regulares son caros. Mientras que por si es preciso averiguar qué archivos para cargar, desde luego no los necesita para hacer la sustituya, y probablemente no debería usar expresiones regulares. Después de todo, usted sabe exactamente lo que está reemplazando así que ¿por qué necesita búsqueda difusa?

Utilice una matriz asociativa y str_replace para hacer sus reemplazos. str_replace soporte a matrices para hacer sustituciones múltiples a la vez. Una sustitución de la línea, no hay bucles.

Por ejemplo:

$substitutions = array('{VAR}'=>file_get_contents('VAR.php'),
'{TEST}'=>file_get_contents('TEST.php'),
...
);

$outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top