Frage

Ich brauche eine Zeichenfolge zu lesen, erkennen eine {VAR}, und dann ein file_get_contents tun ( 'VAR.php') anstelle von {VAR}. Die „VAR“ kann alles genannt werden, wie TEST oder KONTAKT-FORM, etc. Ich möchte nicht wissen, was VAR - einen hartcodierte Zustand nicht zu tun, sondern nur einen Großalphanumerischen Tag umgeben sieht von geschweiften Klammern und einfach eine file_get_contents (), um es zu laden.

Ich weiß, ich preg_match und preg_replace verwenden müssen, aber ich bin durch die regexps auf das Stolpern.

Wie ist das sinnvoll? Es ist nützlich, in Wordpress Einhaken.

War es hilfreich?

Lösung

Orion oben hat eine richtige Lösung, aber es ist nicht wirklich notwendig, eine Callback-Funktion in Ihrem einfachen Fall zu verwenden.

Unter der Annahme, dass die Dateinamen A-Z + Bindestriche Sie es in 1 Zeile tun können PHP / e-Flag in der Regex:

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

Das wird jede Instanz von {VAR} mit dem Inhalt VAR.html ersetzen. Sie könnten einen Weg in den zweiten Begriff Präfix, wenn Sie ein bestimmtes Verzeichnis angeben müssen.

Es gibt die gleichen vageen Sicherheitsbedenken wie oben beschrieben, aber ich kann mich nichts spezifisch.

Andere Tipps

Sie müssen eine Reihe von Dingen zu tun. Ich gehe davon aus Sie die Beinarbeit tun, um die Seitendaten Sie wollen Vorprozess in einen String zu erhalten.

  1. Als erstes werden Sie den regulären Ausdruck müssen richtig passen. Das sollte ziemlich einfach sein, mit so etwas wie /{\w+}/.

  2. Als nächst Sie alle Flags verwenden müssen werden preg_match die Offset-Position in den Seitendaten zu erhalten. Dieser Versatz lassen Sie die Zeichenfolge in dem vor, Matching unterteilen, und nach Teilen des Spiels.

  3. Wenn Sie die 3 Teile haben, müssen Sie Ihr gehören laufen, und halten Sie sie wieder zusammen.

  4. Lather, spülen, wiederholen.

  5. Stoppen Sie, wenn Sie nicht mehr Variablen finden.

Das ist nicht sehr effizient, und es gibt wahrscheinlich bessere Möglichkeiten. Sie können dabei eine preg_split stattdessen Splitting auf /[{}]/ betrachten wollen. Egal, wie Sie es drehen Sie gehen davon aus, dass Sie Ihre eingehenden Daten vertrauen können, und dies wird der gesamte Prozess viel vereinfachen. Um dies zu tun, würde ich den Code Layout wie folgt:

  1. Nehmen Sie Ihre Inhalte und teilen Sie es wie folgt: $parts = preg_split('/[{}]/', $page_string);

  2. eine rekursive Funktion über die Teile mit folgenden Kriterien schreiben:

    • Halt, wenn Länge von arg <3
    • Else, kehren ein neues Array, bestehend aus
    • $ arg [0]. load_data ($ arg [1]). $ Arg [2]
    • und was auch immer in $ argv bleibt [3 ...]
  3. Führen Sie Ihre Funktion über $ Teile.

Sie können es tun, ohne reguläre Ausdrücke (Gott bewahre), so etwas wie:

//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...
    }    
}

Aus der Spitze von meinem Kopf, Sie wollen, dass diese:

// 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

Jetzt werde ich die Regex erklärt

 \{([-A-Z]+)\}
  • Die \{ und \} es einfach sagen, die geschweiften Klammern entsprechen. Sie müssen die Schrägstriche, wie { und } sind Sonderzeichen, also müssen sie entkommen.
  • Die ( und ) schaffen eine Gruppierung. Grundsätzlich ist dieser können Sie bestimmte Teile des Spiels zu extrahieren. Ich benutze es oben in der Funktion nur in den geschweiften Klammern, die Dinge zu passen, ohne sich die Klammern zu entsprechen. Wenn ich dies nicht getan hat, dann muss ich würde das { und } aus dem Spiel strippen, was ärgerlich sein würde
  • Die [-A-Z] sagt „jeden Großbuchstaben entsprechen, oder eine -
  • Die + nach dem [-A-Z] bedeutet, dass wir mindestens 1 Charakter haben müssen, aber wir können bis zu einer beliebigen Anzahl haben.

Vergleichsweise gesprochen, sind reguläre Ausdrücke teuer. Während Sie sie benötigen, um herauszufinden, was zu Dateien zu laden, müssen Sie sicher nicht sich für die ersetzen tun, und wahrscheinlich nicht regulären Ausdrücke verwenden sollten. Schließlich wissen Sie genau, was Sie ersetzen also warum brauchen Sie Fuzzy-Suche?

Verwenden Sie ein assoziatives Array und str_replace Ihren Ersatz zu tun. str_replace unterstützt Arrays für die auf einmal mehrere Ersetzungen zu tun. Eine Linie Substitution, keine Schleifen.

Zum Beispiel:

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

$outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top