Heim  >  Artikel  >  Backend-Entwicklung  >  Regulärer PHP-Ausdruck – Nachahmung von Smarty

Regulärer PHP-Ausdruck – Nachahmung von Smarty

WBOY
WBOYOriginal
2016-08-08 09:22:071245Durchsuche
/**
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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn