Portal > Foren > PHP > PHP-Programmierung > Template-Blöcke "fetchen", Probleme mit regulärem Ausdruck
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 14.02.2007, 09:30 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard Template-Blöcke "fetchen", Probleme mit regulärem Ausdruck

Hallo,
in diesem Tutorial werden Blöcke in Template mittels
PHP-Code:
$pattern '/(?:<!-- BEGIN )([\w]{1,})(?: -->)(.*?)(?:<!-- END -->)/is'
herausgefiltert.

Das bezieht sich ja im Tutorial auf Blöcke, die folgende Syntax haben
HTML-Code:
<!-- BEGIN sample_block -->
<div>irgendein Inhalt</div>
<!-- END --> 
Ich würde nun aber gerne dynamisch, also ohne Angabe des Namens des Template-Blocks, eine folgende Struktur "fetchen".
Quasi so einen Template-Code:
HTML-Code:
<!-- BEGIN sample_block -->
<div>irgendein Inhalt</div>
<!-- END sample_block --> 

In der PEAR-Klasse HTML_PHPLIB_Template wird das mittels
PHP-Code:
reg "/[ \t]*<!--\s+BEGIN $name\s+-->\s*?\n?(\s*.*?\n?)\s*<!--\s+END $name\s+-->\s*?\n?/sm"
gemacht, allerdings ist hier die Angabe des Namens von Nöten. Das möchte ich aber vermeiden, da ich ehrlich gesagt den Sinn einer setBlock()-Methode nicht sehe. Egal.

Mein Problem ist schlichtweg der reguläre Ausdruck, da ich nicht weiß, wie ich einen RegExp abhängig von einem "match" in einem RegExp machen kann.
Geht das überhaupt? :-/

Sollte irgendwas unverständlich sein, einfach kurz nachfragen.
Viele, vielen Dank für Eure Hilfe.

Grüße, Ben.


[Nachtrag]
Der Grund ist einfach der, dass die gewünschte Syntax derzeit in den Templates verwendet wird und ich nicht alle Templates abändern möchte!
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 11:11 Nach oben    #2
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Also laut http://de.php.net/manual/en/function...atch.php#37343 funktioniert die Backreference mit einem \\Zahl, aber ich bekomm das Beispiel mit dem regextester nicht zum laufen.....

//edit: Andererseits funktioniert das lokal bei mir....

//edit2: und auch das funktioniert bei mir nur lokal:

PHP-Code:
<?php
$text 
="<!-- BEGIN sample_block -->
<div>irgendein Inhalt</div>
<!-- END sample_block -->"
;
$search "/(?:<!-- BEGIN )([\w]{1,})(?: -->)(.*?)(?:<!-- END )(\\1)(?: -->)/si";
if (
preg_match($search$text$match))
{
   
print_r($match);
}
?>
Und als Ausgabe bekomme ich:
Code:
Array
(
    [0] => <!-- BEGIN sample_block -->
<div>irgendein Inhalt</div>
<!-- END sample_block -->
    [1] => sample_block
    [2] => 
<div>irgendein Inhalt</div>

    [3] => sample_block
)
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (14.02.2007 um 11:19 Uhr)
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 12:15 Nach oben    #3
Benutzer
 
Benutzerbild von xabbuh
 
Registriert seit: 03.12.2005
Ort: Osnabrück
Beiträge: 76
Standard

Hallo,

im Regex-Tester wird der reguläre Ausdruck scheinbar in Singlequotes ausgewertet. Dann ist die Backreference anscheinend nur mit \X statt mit \\X zu kennzeichnen.

Grüße
xabbuh ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 12:20 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Hm,
also auslesen kann ich das, aber ersetzen nicht. Ersetzen? Jou, ich habe diese Methode hier
PHP-Code:
    private function fetchBlocks() {

        
// fetch all template blocks in the template code ..
        
$pattern '/(?:<!-- BEGIN )([\w]{1,})(?: -->)(.*?)(?:<!-- END )(\\1)(?: -->)/si';
        
preg_match_all($pattern$this->template$matchedBlocks);

        
// .. and store them in a class variable.
        // Afterwards replace the template block in the template by a respective template variable.
        
foreach($matchedBlocks[1] as $key => $blockName) {
            
$this->blocks[$blockName] = $matchedBlocks[2][$key];

            
$pattern '/(?:<!-- BEGIN ' $blockName ' -->)(.*?)(?:<!-- END )(\\1)(?: -->)/si';

            
$blockVar $this->leftDelimiter $blockName $this->rightDelimiter;
            
$this->template preg_replace($pattern$blockVar$this->template);
        }
    } 
Ich ersetze die Blöcke im Template-Code durch eine Template-Variable mit dem Namen des Blocks und weise dann nach dem "parsen" eines Blocks das Ergebnis dieser Template-Variablen zu, so dass ich im Endeffekt nur ein Template-File ohne Blöcke, nur mit Variablen habe.

Das als Hintergrundinformation, falls das jemand braucht.
Wie gesagt. Ich erhalte bei der Ausgabe von $matchedBlocks Folgendes:
Code:
array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(98) "<!-- BEGIN sample_list -->
 <li>{sample_list_item}, Zugriffe: {hits}</li>
<!-- END sample_list -->"
  }
  [1]=>
  array(1) {
    [0]=>
    string(11) "sample_list"
  }
  [2]=>
  array(1) {
    [0]=>
    string(48) "
 <li>{sample_list_item}, Zugriffe: {hits}</li>
"
  }
  [3]=>
  array(1) {
    [0]=>
    string(11) "sample_list"
  }
}
Wenn ich dann folgende Code austeste
PHP-Code:
            $count 0;
            
$this->template preg_replace($pattern$blockVar$this->template, -1$count);
            echo 
$count
erhalte ich als Ausgabe "0", es wurde also nichts ersetzt.

Weiß jemand warum?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 12:34 Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

EDIT: ach Käse ...

Aber ob \\1 oder \1, wenn schon $blockName vorhanden ist, kann es auch einfach im 2. Teil mit eingesetzt werden und Ruhe ist.

Geändert von CIX88 (14.02.2007 um 12:49 Uhr)
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 13:00 Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 159
Standard

Hallo,

also ich würde das Ende-Tag einfach korrekt eintragen:

PHP-Code:
$pattern '/(?:<!-- BEGIN ' $blockName ' -->)(.*?)(?:<!-- END ' $blockName ' -->)/si'
Schließlich wird der Blockname im BEGIN nicht mehr separat ausgewertet!

Und weil ich nicht so viele Daten haben will, würde ich das erste Pattern wie folgt ändern:
PHP-Code:
$pattern '/(?:[ \t]*<!-- BEGIN )(\w+)(?: -->[ \t]*)(.*?)(?:[ \t]*<!-- END )(?:\\1)(?: -->[ \t]*)/si'
und den 2. in der foreach schleife:
PHP-Code:
$pattern '/(?:[ \t]*<!-- BEGIN ' $blockName ' -->[ \t]*)(.*?)(?:[ \t]*<!-- END ' $blockName ' -->[ \t]*)/si'

Gruß,
Jumper, the II.

Geändert von JumperII (14.02.2007 um 13:07 Uhr)
JumperII ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 13:47 Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Warum denn \t ?
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 13:56 Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 159
Standard

[ \t] .... Leerzeichen und Tabs vorn und hinten wegschneiden .... Stören mich bei solchen Aktionen Und \s greift im Gegenzug zu weit für meinen Geschmack .... Außerdem mag ich die \? Ersetzungen nicht ... die muß man dann doch auswendig kennen ...

Gruß,
Jumper, the II.
JumperII ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 14:11 Nach oben    #9
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Jojo schon klar was \t ist, aber das WARUM nicht ganz
Ist doch egal, was davor und dahinter steht.
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 14:57 Nach oben    #10
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Ich habe jetzt mal den RegExp vom Jumper genommen.
Diskutiert ruhig weiter. Lese ich mir gerne durch.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 18:24 Nach oben    #11
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 159
Standard

Zitat:
Zitat von CIX88 Beitrag anzeigen
Jojo schon klar was \t ist, aber das WARUM nicht ganz
Ist doch egal, was davor und dahinter steht.
Nicht unbedingt .... warum auch immer kann auch ein:
Code:
  <!-- BEGIN block --> <h1>Wenn Schon, denn Schon</h1>
   bla
  <!-- END block --> <br />
stehen. Dann sucht man sich dumm und dusslig. Lieber hier unnütze Sachen raus, aber so, dass definitiv der Inhalt nicht verlustig gehen kann.

Gruß,
Jumper, the II.
JumperII ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 18:45 Nach oben    #12
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Kann ich mir im Moment nicht vorstellen, da du ja schon nach <!-- und --> suchst bzw. das schon als Bezugspunkte für dein Pattern benutzt.
Anders wäre es, wenn du noch ^ und $ mit benutzt, dann wäre es korrekt.

EDIT:

Zitat:
Dann sucht man sich dumm und dusslig
Kann ich nicht nachvollziehen:
http://www.regex-tester.de/regex4_20070214185643.html

Geändert von CIX88 (14.02.2007 um 18:57 Uhr)
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 19:19 Nach oben    #13
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 159
Standard

Ok, ich sehe, Du hast es nicht verstanden.
a) Effektiv herauskommen tut was verwertbares ... keine frage.
b) Mit Deinem "Warum nicht ganz" hatte ich interpretiert, dass Du unabhängig von den restlichen Inhalten der Zeile diese Zeile komplett ersetzen willst .... daher das für dich unverständliche Beispiel.
c) ich u.U. für weitere Verarbeitungen die Zeilenvorschübe (und vor allem leere Zeilenvorschübe vor und nachher) gerne da haben möchte.

Ergo habe ich die Zeilen mit <!-- .. --> bei führenden und abschließenden Leerzeichen und Tabs diese beraubt, weil sie typischerweise dort unnütz sind.

Aber das ist jedem seinem Geschmack

Andere ziehen dann lieber diesen vor, um sich zu gehen:
PHP-Code:
'/(?:[ \t]*<!-- BEGIN )(\w+)(?: -->)(.*)(?:<!-- END )(?:\\1)(?: -->[ \t]*)/si' 
Gruß und Schluss, Ben hat, was er suchte ...
Jumper, the II.
JumperII ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.02.2007, 20:55 Nach oben    #14
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Ähmmm, mein Posting bezog sich nur auf das \t - mehr nicht.
Und das weitere Angaben vor <!-- bzw. nach --> nicht wirklich gebraucht werden.
Das war schon alles

Wobei ich schon wieder (.*) anzweifeln würde
Aber nöööö ... keine Lust ... Grüße ...
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45