php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #31 (permalink)  
Alt 14-10-2004, 21:59
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

/edit2: Ok, ich habs hingekriegt.

Geändert von OliOli (14-10-2004 um 22:05 Uhr)
Mit Zitat antworten
  #32 (permalink)  
Alt 15-10-2004, 00:13
rythms
 Junior Member
Links : Onlinestatus : rythms ist offline
Registriert seit: Jun 2003
Beiträge: 219
rythms ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TheBo
wenn die Klasse von rythmus (oder so) zumindest funktionieren würde ... mein Post bei seiner Klasse wird ignorier ... und in ICQ antwortet er auch nicht ...

ich "muss" auch andauernd support für meine scripte geben, und tuhe das auch nicht immer so gerne, aber ich weiss das ich anderen helfe.

Also, bitte melde dich mal bei mir ! (162424599)
Oh, hab den Post "drüben" nicht gesehen und lese fast nur hier im Brainstorming. ICQ bleibt zwecks Arbeitsmoral aus

Schreib doch am besten mal ne email.
Mit Zitat antworten
  #33 (permalink)  
Alt 15-10-2004, 19:41
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

So, weiter gehts mit Problemen.
Ich hab die Klasse jetzt auf folgendem Stand:

PHP-Code:
class template {

    var 
$open// Starttag der Platzhalter
    
var $close// Endtag der Platzhalter
    
var $clearopen// Starttag _ohne_ escape!
    
var $clearclose// Endtag _ohne_ escape!
    
var $values// Werte der zu ersetzenden Strings
    
var $tplF// Template Verzeichnis
    
var $fileType// Endung der Templates (.tpl, .htm o.ä.)

    // Definieren von Variablen
    
function template($open='{'$close='}'$fileType='.tpl'$tplF='./') {
        
$this->open preg_quote($open'/');
        
$this->close preg_quote($close'/');
        
$this->clearopen $open;
        
$this->clearclose $close;
        
$this->values = array();
        
$this->fileType $fileType;
        
$this->tplF $tplF;
    }

    
// Den Platzhaltern Werte zuweisen
    // Wenn isFile = true, wird versucht eine Datei als Wert einzubinden
    
function assign($var$value$isFile=false$tplFolder=false) {
        if(
$tplFolder == false$tplFolder $this->tplF;
        if(
$isFile == true) {
            if(!
is_readable($tplFolder.$value.$this->fileType)) {
                
trigger_error('File <b>'.$tplFolder.$value.$this->fileType.'</b> is not readable.',ERROR);
            } else {
                
$this->values[$var] = file_get_contents($tplFolder.$value.$this->fileType);
            }
        } else {
            
$this->values[$var] = $value;
        }
    }

    
// Ausgabe der Templates
    
function output($tpl) {
        if(!
is_readable($this->tplF.$tpl.$this->fileType)) {
            
trigger_error('File <b>'.$this->tplF.$tpl.$this->fileType.'</b> is not readable.',FATAL);
        } else {
            
$content file_get_contents($this->tplF.$tpl.$this->fileType);
            echo 
$this->parse($content);
        }
    }

    
// replace var
    
function replace_var($key) {
        return 
$this->values[$key[1]];
    }

    
// Array ersetzen
    
function replace_array($ar) {

        
$pattern '/'.$this->open.'(.*?)'.$this->close.'/iU';
        
$pattern2 '/'.$this->open.'array name=([^'.$this->close.']+)'.$this->close.'(.*?)'.$this->open.'\/array'.$this->close.'/iUm';

        
$return '';
        for(
$i=0;$i<count($this->values[$ar[1]]);$i++) {

            
$string $ar[2];
            if(
preg_match($pattern2$string)) $string $this->parse($string$only=2);

            foreach(
$this->values[$ar[1]][$i] AS $key => $val) {
                
$string str_replace($this->clearopen.$key.$this->clearclose,$val,$string);
            }
            
// $string = $this->parse($string, $only=1);

            
$return .= $string;
        }

        return 
$return;
    }

    
// Parsen
    
function parse($string$only=3) {
        if(
$only != 2) {
            
// Ersetzen von Schleifen
            
$pattern '/'.$this->open.'array name=([^'.$this->close.']+)'.$this->close.'(.*?)'.$this->open.'\/array'.$this->close.'/iUm';
            
$string preg_replace_callback($pattern,array(&$this'replace_array'),$string);
        }

        if(
$only != 1) {
            
// Ersetzen von einfachen Platzhaltern
            
$pattern '/'.$this->open.'(.*?)'.$this->close.'/i';
            
$string preg_replace_callback($pattern,array(&$this'replace_var'),$string);
            
$string $this->parse($string$only=1);
        }

        return 
$string;
    }


Derzeit habe ich noch 2 Probleme:
1. Das Script sucht beim Ersetzen eines Arrays nach dem ersten Vorkommen von {array name=xxx} und nach dem letzten {/array}, egal ob die zusammengehören. Die ? sind im Regexp vorhanden, ich wüsste nicht, wo ich da noch eins zwischenbauen sollte...
2. Wenn zwischen {array name=xxx} und {/array} ein Zeilenumbruch ist, trifft das Suchmuster nicht mehr zu, trotz Modifier "m".

Vielen Dank für Hilfe im Vorraus.

MfG Oli
Mit Zitat antworten
  #34 (permalink)  
Alt 15-10-2004, 19:44
derHund
 PHP Master
Links : Onlinestatus : derHund ist offline
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
derHund ist zur Zeit noch ein unbeschriebenes Blatt
Standard

zu 1. unter den annahme, du benutzt keine verschachtelungen, U
zu 2. m erfüllt andere zwecke, nimm s

habe mir, btw, dein pattern nicht angeschaut ...
__________________
Die Zeit hat ihre Kinder längst gefressen
Mit Zitat antworten
  #35 (permalink)  
Alt 15-10-2004, 20:38
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

U verwende ich bereits als Modifier.
Davon abgesehen, dass Verschachtelungen möglich sein sollen, gehts auch ohne nicht.

s bei Zeilenumbrüchen funktioniert, danke.
http://www.php-resource.de/tutorials/read/10/1/ laut diesem Tutorial ist m dafür aber geeignet, s wäre genau das Gegenteil.
Mit Zitat antworten
  #36 (permalink)  
Alt 15-10-2004, 23:20
derHund
 PHP Master
Links : Onlinestatus : derHund ist offline
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
derHund ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Davon abgesehen, dass Verschachtelungen möglich sein sollen, gehts auch ohne nicht.
eventuell solltest du dann mal ein klartext-pattern zeigen ...

für verschachtelungen solltest du dir mal (?R) anschauen ... dient erstmal nur dazu, die richtige verschachtelung zu finden.

Code:
#{array name=(.+)}(.+){/array}#isU
matched bei meinen tests auf deine gegebenheit

die { brauchst du scheinbar nicht slashen, weil php das wohl unterscheiden kann ...
__________________
Die Zeit hat ihre Kinder längst gefressen

Geändert von derHund (15-10-2004 um 23:22 Uhr)
Mit Zitat antworten
  #37 (permalink)  
Alt 16-10-2004, 15:08
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

hi derHund,

also dein Suchmuster funktioniert soweit.

Das mit dem (?R) hab ich allerdings nicht verstanden.
Ich hab mich mal hier (http://www.php-faq.de/ch/ch-regexp.html) umgesehen, aber da nichts darüber gefunden.

MfG Oli
Mit Zitat antworten
  #38 (permalink)  
Alt 16-10-2004, 15:10
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Ich denke mal, dass der Hund ausschließende Rules(=R) meint. Siehe das Tut auf dieser Seite (von Sky)
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #39 (permalink)  
Alt 16-10-2004, 16:32
derHund
 PHP Master
Links : Onlinestatus : derHund ist offline
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
derHund ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Das mit dem (?R) hab ich allerdings nicht verstanden.
http://www.php-resource.de/manual.ph...pattern.syntax

ganz unten, vorletzter abschnitt ... damit du den zugehörigen, schließenden tag findest ...
__________________
Die Zeit hat ihre Kinder längst gefressen
Mit Zitat antworten
  #40 (permalink)  
Alt 20-10-2004, 17:33
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

so, da bin ich wieder.

Also so wie ich derHund verstanden habe, muss ich mein Pattern so aufbauen:

Suche nach alle {array name=x} ... {/array}, wo in ... kein weiteres {array name=x} enthalten ist.

Das wäre zumindest die Lösung, da er dann Verschachtelungen von Innen nach außen ersetzt.

Mit den Assertions ist das allerdings ein bisschen komisch.

Mein Suchmuster sieht so aus:

Code:
#{array name=(.*?)} (.*) {/array}#isU
Jetzt muss ich es mit diesen Assertions schaffen, dass es nur zutrifft, wenn zwischen den Tags kein weiteres {array name=(.*?)} steht.

Code:
#{array name=(.*?)} (.*(?!:{array name=(.*?)})) {/array}#isU
Mein Denkansatz. Funktioniert leider nicht.

Ich hoffe, ich hab dich richtig verstanden, derHund.

MfG Oli

Geändert von OliOli (20-10-2004 um 17:36 Uhr)
Mit Zitat antworten
  #41 (permalink)  
Alt 31-10-2004, 12:03
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

Hallo,

Leider bin ich nach etlich langem rumprobieren immer noch zu keiner Lösung gekommen. Ich fasse mal zusammen, wo ich derzeit stehe:

Ich suche nach wie vor, einen pattern, der in einem templates zeichenketten wie {array name=(.*)} (.*) {/array} ersetzt durch den Rückgabewert einer Funktion.

Mein code:
PHP-Code:
$pattern '/'.$this->open.'array'.$add.' name=(.*)'.$this->close.'(.*)'.$this->open.'\/array'.$this->close.'/isU';
                
$string preg_replace_callback($pattern,array(&$this'replace_array'),$string); 
Folgende Probleme habe ich:
  • Ich komme mit dem greedy nicht so ganz zurecht. Wenn ich einerseits verschachtelte, aber auch aufeinander folgende arrays habe, dann wird logischerweise immer was falsch gemacht. Bsp:
    {array name=asdj} ich bin ein verschachtelrtes {array name=zweites} array {/array} und und und {/array} <br> {array name=drittes} Ich stehe hinter den beiden anderen {/array}
    Wenn ich den modifier U oder ein ? nicht verwende, dann nimmt der das {array name=xxx} vom allerersten array, und das {/array} vom allerletzten. Die gehören dummerweise nicht zueinander. Wenn ich den modifier benutze, dann nimmt er logischerweise das erste {array name=xxx} und das erste {/array}, die ja auch nicht zueinander gehören. Hier hab ich nur einen Lösungsansatz: Wenn ich den regex so wenig wie möglich fressen lasse, ihm aber sage, dass zwischen den tags kein array name=xxx} vorkommen darf, dann müsste er sich von innen nach außen vorarbeiten können. Wie ich das mache, ist mir aber schleierhaft.
  • Verschachtelungen sind zwar, das habe ich inzwischen soweit verstanden, mit (?R) also recursive pattern lösbar, aber wie genau das auszusehen hat, weiß ich noch nicht.

Wäre super nett, wenn ihr versucht mir nochmal zu helfen.
Immer bedenken, dass ich php (noch) nicht gut kann.

MfG Oli
Mit Zitat antworten
  #42 (permalink)  
Alt 31-10-2004, 13:03
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Ich suche nach wie vor, einen pattern, der in einem templates zeichenketten wie {array name=(.*)} (.*) {/array} ersetzt durch den Rückgabewert einer Funktion.
anderer vorschlag:

lass es einfach durch block_$1 ersetzen.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #43 (permalink)  
Alt 31-10-2004, 13:45
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

hab ich auch schon dran gedacht, aber erstmal muss er ja das passende {/array} zum {array name=xxx} finden
Mit Zitat antworten
  #44 (permalink)  
Alt 31-10-2004, 14:01
derHund
 PHP Master
Links : Onlinestatus : derHund ist offline
Registriert seit: Aug 2003
Ort: Hundehütte
Beiträge: 5.293
derHund ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
hab ich auch schon dran gedacht, aber erstmal muss er ja das passende {/array} zum {array name=xxx} finden
das passende findest du mit hilfe von ?R. dazu ist es da.

kuckst du: http://pcre.nophia.de/evaluate/267c6...dex.php#output bzw. http://pcre.nophia.de/evaluate/1a7b9...dex.php#output

in \1 findest du den namen, in \2 den inhalt, den du erneut - vorzugsweise rekursiv - parsen mußt. siehe auch das beispiel in den codeschnipseln.
__________________
Die Zeit hat ihre Kinder längst gefressen

Geändert von derHund (31-10-2004 um 14:10 Uhr)
Mit Zitat antworten
  #45 (permalink)  
Alt 31-10-2004, 14:44
OliOli
 Member
Links : Onlinestatus : OliOli ist offline
Registriert seit: May 2003
Beiträge: 367
OliOli ist zur Zeit noch ein unbeschriebenes Blatt
OliOli eine Nachricht über ICQ schicken
Standard

Vielen lieben Dank, alle zusammen.

Die Klasse funktioniert jetzt so, wie sie soll.

Hier nochmal das ganze:

PHP-Code:
<?php class template {

    var 
$open// Starttag der Platzhalter
    
var $close// Endtag der Platzhalter
    
var $values// Werte der zu ersetzenden Strings
    
var $tplF// Template Verzeichnis
    
var $fileType// Endung der Templates (.tpl, .htm o.ä.)
    
var $m// Zähler für Arrays

    // Definieren von Variablen
    
function template($open='{'$close='}'$fileType='.tpl'$tplF='./') {
        
$this->open $open;
        
$this->close $close;
        
$this->values = array();
        
$this->fileType $fileType;
        
$this->tplF $tplF;
        
$this->0;
    }

    
// Den Platzhaltern Werte zuweisen
    // Wenn isFile = true, wird versucht eine Datei als Wert einzubinden
    
function assign($var$value$isFile=false$tplFolder=false) {
        if(
$tplFolder == false$tplFolder $this->tplF;
        if(
$isFile == true) {
            if(!
is_readable($tplFolder.$value.$this->fileType)) {
                
trigger_error('File <b>'.$tplFolder.$value.$this->fileType.'</b> is not readable.',ERROR);
            } else {
                
$this->values[$var] = $this->parse(file_get_contents($tplFolder.$value.$this->fileType),2);
            }
        } else {
            
$this->values[$var] = $value;
        }
    }

    
// Ausgabe der Templates
    
function output($tpl) {
        if(!
is_readable($this->tplF.$tpl.$this->fileType)) {
            
trigger_error('File <b>'.$this->tplF.$tpl.$this->fileType.'</b> is not readable.',FATAL);
        } else {
            
$content file_get_contents($this->tplF.$tpl.$this->fileType);
            echo 
$this->parse($content);
        }
    }

    
// replace var
    
function replace_var($key) {
        return 
$this->values[$key[1]];
    }

    
// Array ersetzen
    
function replace_array($ar) {
        
$pattern '/'.$this->open.'array name=(.*?)'.$this->close.'(.*)'.$this->open.'\/array'.$this->close.'/is';

        
$return '';
        for(
$i=0;$i<count($this->values[$ar[1]]);$i++) {
            
$string $ar[2];
            if(
preg_match($pattern$string)) 
                
$string $this->parse($string$only=1);
            foreach(
$this->values[$ar[1]][$i] AS $key => $val) {
                
$string str_replace($this->open.$key.$this->close,$val,$string);
            }
            
$return .= $string;
        }

        return 
$return;
    }

    
// Parsen
    
function parse($string$only=3) {
        if(
$only != 1) {
            foreach(
$this->values AS $key => $val) {
                if(!
is_array($val)) {
                    
$string str_replace($this->clearopen.$key.$this->clearclose,$val,$string);
                }
            }
        }
        if(
$only != 2) {
            
$pattern '/'.$this->open.'array name=(.*)'.$this->close.'(((?R)|(.*))*)'.$this->open.'\/array'.$this->close.'/isU';
            
$string preg_replace_callback($pattern,array(&$this'replace_array'),$string);
        }
        return 
$string;
    }
?>
Was kann die Klasse?
  • Normale Platzhalter entweder durch strings oder durch Dateien ersetzen, in denen wiederum Platzhalter entahlten sein dürfen. (AFAIK unendlich tiefe verschachtelung möglich)
  • Ersetzen von arrays, nach dem Schema {array name=ARRAY_NAME} text {ARRAY_ITEM} {/array}. Verschachtelungen beliebig tief möglich.

MfG Oli
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

myExplorer

explorer-ähnliche Darstellung von Verzeichnisinhalten. Ideal für Downloadordner. Möglichkeit Filter zu definieren um nur bestimmte Dateien/Ordner darzustellen. Sehr leicht einzubinden.

16.07.2019 bmitt | Kategorie: PHP/ File
WebAudio Player

Dieser Music-Player demonstriert, was mit der WebAudio-API so alles möglich ist. Er ist dazu gedacht, dass ihr euren Besuchern Musik auf der eigenen Homepage anbieten könnt.

16.07.2019 numaek | Kategorie: JAVASCRIPT/ sonstig
Plates native PHP template system

Plates ist ein natives PHP-Vorlagensystem, das schnell, einfach zu verwenden und einfach zu erweitern ist.

24.05.2019 Berni | Kategorie: PHP/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:34 Uhr.