/**
Der Klassenname Smarty ist eine benutzerdefinierte Vorlagen-Engine
Laden Sie die Vorlagendatei über dieses Klassenobjekt, analysieren Sie sie und geben Sie das analysierte Ergebnis aus
*/
class Smarty {
public $template_dir = 'templates'; //Definition Verzeichnis, in dem Vorlagendateien gespeichert werden
public $compile_dir = 'templates_c'; // Definieren Sie das Verzeichnis, in dem Dateien gespeichert werden, nachdem sie von der Vorlagen-Engine kombiniert wurden
public $ left_delimiter = '<{ '; 🎜>
private $tpl_vars = array(); ’s ‐ ‐ ‐ ‐ ‐ 🎜>Funktionszuweisung($ tpl_var, $value = null) {
if ($tpl_var != '') ] =. $value ;
}
>/* Nach der Vorlagendatei im angegebenen Verzeichnis suchen*/
$tplFile = $this->template_dir.'/'.$fileName; /* Wenn die zu verarbeitende Vorlagendatei nicht vorhanden ist, beenden Sie das Programm und melden Sie einen Fehler >sterben ("Vorlagedatei {$tplFile} existiert nicht!");
}
/* Holen Sie sich die kombinierte Vorlagendatei, der Inhalt in dieser Datei wurde ersetzt*/
$comFileName = $ this-> ;compile_dir."/com_".$fileName.'.php';
/* Stellen Sie fest, ob die ersetzte Datei vorhanden ist. Wenn sie vorhanden ist, aber geändert wurde, müssen Sie sie neu erstellen*/
if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
/* Rufen Sie die interne Ersetzungsvorlagenmethode auf*/
$repContent = $this->tpl_replace(file_get_contents($tplFile));
/* Speichern Sie die vom System kombinierte Skriptdatei*/
file_put_contents($comFileName, $repContent);
}
/* Enthält die verarbeitete Vorlagendateiausgabe an den Client*/
include($comFileName);
}
private function tpl_replace($content) {
/* Escapen Sie die Sonderzeichen, die die Regelmäßigkeit zwischen den linken und rechten Trennzeichen beeinflussen. Zum Beispiel <{ }> ;Escape<{ }> $left = preg_quote($this->left_delimiter, '/');
$right = preg_quote ($this->right_delimiter, '/');/* Muster-Array regulärer Ausdrücke, die mit verschiedenen Bezeichnern in der Vorlage übereinstimmen*/$ pattern = array(
/* Beispiel: Übereinstimmung mit Variablen in der Vorlage , "<{ $var }>" */'/'.$left 's*$([a-zA-Z_x7f-xff][a-zA-Z0- 9_x7f-xff]*)s*'.$right.'/i',
/* Entspricht dem if-Bezeichner in der Vorlage, z. B. „<{ if $col == „sex“ }> <{ /if }> " * /
'/'.$left.'s*ifs*(.+?)s*'.$right.'(.+?)'.$left.'s* /ifs *'.$right.'/ies',
/* Entspricht der elseif-Kennung, z. B. „<{ elseif $col == „sex“ }> */'/'.$left.'s*elses*ifs*(.+?)s*'.$right.'/ies',
/* Match Sonst-Bezeichnersymbole wie „<{ else }>“ */
'/'.$left.'s*elses*'.$right.'/is',
/* wird verwendet, um die Schleifenkennung in der Vorlage abzugleichen und um die Werte im Array zu durchlaufen, z. B. „<{ loop $arrs $value }> <{ / loop}>" */
'/'.$left.'s*loops+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0- 9_x7f-xff]*)s*' .$right.'(.+?)'.$left.'s*/loops*'.$right.'/is',
/ * wird verwendet, um die Schlüssel und Summen im Array-Wert zu durchlaufen, z. B. „<{ loop $arrs $key => $value }> <{ /loop}>“ '/'.$left.'s* Schleifen+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*=>s* $(S+)s*'.$right.'( .+?)'.$left.'s*/loop s*'.$right.'/is',
/* Entspricht der Include-ID, zum Beispiel '<{ include " header.html" }> */
'/'.$left.'s*includes+["']?( .+?)["']?s*'.$ right.'/ie'
);
/* Ersetzen mit regulären Ausdrücken aus der Vorlage String-Array entsprechend der Formel */
$replacement = array(
/* Ersetzen Sie Variablen in die Vorlagetpl_vars ["var"] */
'tpl_vars["${1}"]; ?>',
/* Ersetzen Sie die if-Zeichenfolge in der Vorlage /
'$ this->stripvtags('','${2}' )',
/* elseif string $this->stripvtags('',"")',
/* Zeichenfolge zum Ersetzen von else */
'',
/* Die folgenden zwei Elemente werden verwendet. Ersetzen Sie die Schleife Bezeichner in der Vorlage mit dem foreach-Format */
'tpl_vars["${1}"] als $this->tpl_vars[ "$ {2}"]) { ?>${3}',
'tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}',
/*Include-String ersetzen */
'file_get_contents($this->template_dir."/${1}")'
);
/* Verwenden Sie die regelmäßige Ersetzungsfunktion, um */
$repContent = preg_replace($pattern, $replacement, $content);
/* Wenn noch Bezeichner zu ersetzen sind, rufen Sie sich selbst rekursiv auf, um sie erneut zu ersetzen*/
if(preg_match('/ '.$ left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {
$repContent = $ this-> ;tpl_replace($repContent);
}
/* Ersetzte Zeichenfolge zurückgeben */
return $repContent;
}
/**
Private Methode, die intern verwendet wird, um in bedingten Anweisungen verwendete Variablen durch entsprechende Werte zu ersetzen
@paramstring $ expr stellt das Start-Tag der bedingten Anweisung in der Vorlage bereit. Das End-Tag von
@returnstrin verbindet die verarbeiteten bedingte Anweisungen und Rückgaben
*/private function stripvtags($ expr, $statement='') {
/* Regelmäßige Übereinstimmung von Variablen*/
$var_pattern = '/s*$([a-zA-Z_x7f -xff][a-zA-Z0-9_x7f-xff]*)s*/is';
/* Variablen durch Werte ersetzen*/
$ expr = preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr);
/* Escape und Ersetzen von Anführungszeichen im Start-Tag*/
$expr = str_replace("\"", """, $expr);
/* Anführungszeichen im Anweisungstext und im schließenden Tag ersetzen*/
$statement = str_replace("\"", """, $statement);
/* Rückgabe nach Verkettung der verarbeiteten bedingten Anweisungen*/
return $expr.$statement;
}
}
Urheberrechtserklärung: Bei diesem Artikel handelt es sich um einen Originalartikel des Bloggers, dürfen nicht ohne Genehmigung des Bloggers reproduziert werden.
Das Obige hat PHP-reguläre Ausdrücke eingeführt, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.