Regular Expression

  • Hallo,

    ich scheitere leider gerade an einer Regular Expression (auch mit Hilfe von Doku und irgendwelchen Testern). Wenn das also jemand im Schlaf beherrscht und grad Zeit hat:

    Folgendes soll gefunden werden:
    <-- MENU -->
    <-- MENU (0-9) -->
    also bspw. <!-- MENU 3 -->
    <-- MENU (0-9)-(0-9) --> also bspw. <!-- MENU 1-3 -->

    Vielen Dank schon mal!

  • Nur aus Neugierde, wird das eine TPL ENGINE?

    Ich würde es nicht mit Regulären ausdrücken machen sondern mit strpos etc, deswegen bin ich dir da jetzt keine Hilfe;)

    Aber wenn es sein muss so ähnlich geht es schon

    Code
    $string = 'ddas<!-- MENU 1 -->asd <!-- MENU 2-3 -->dadasd';
    preg_match_all('/<!-- MENU (.*?) -->/s', $string, $matches) ;
    var_dump($matches);

    mfg

    Einmal editiert, zuletzt von Pion (6. Oktober 2010 um 18:01)

  • Ja, wird so eine Art Template Engine aber wieso meinst du, dass strpos sich da besser anbietet als Regular Expressions?

    PHP
    preg_match_all('/<!-- MENU (.*?) -->/s', $string, $matches);


    Diese Expression würde aber nicht nur auf die drei Beispiele von mir passen.
    Außerdem hätte ich im Ergebniss, bei bspw. <!-- MENU 2-3 -->, nur den String "2-3" und nicht 2 und 3 getrennt.

    Naja, bin jetzt eh erstmal darauf angewiesen selber weiter zu probieren. :P
    Dank dirt, trotzdem! :)

  • Zitat


    Ja, wird so eine Art Template Engine aber wieso meinst du, dass strpos sich da besser anbietet als Regular Expressions?


    Einfach desdewegen, da Stringfunktionen in php bedeutend schneller sind als reguläre Ausdrücke.
    Wenn schon eine Templateengine, würde ich versuchen eine Lösung mit strpos/str_replace zu entwickeln.
    Das reicht dafür m.E. nach vollkommen aus.


  • Mal abgesehen davon das PHP eine gute Template Engine ist und man sowas nicht braucht


    Kannst doch mit PHP sauber dann das verarbeiten

    Einmal editiert, zuletzt von Pion (7. Oktober 2010 um 16:59)

  • Einfach desdewegen, da Stringfunktionen in php bedeutend schneller sind als reguläre Ausdrücke.


    Wenn ich dafür aber 10 oder 20 mal irgendeine Stringfunktion verwenden muss um alle möglichen Fälle zu berücksichtigen, die ich auch mit einer Regular Expression abbilden kann, ist deine Argumentation auch hinfällig. Außerdem will ich keine was weiß ich wie riesigen Dateimengen durchforsten sondern ein einfaches HTML-Template. Es geht hier also eh nur um Millisekunden und dann wird das ganze auch noch gecached.

    Hier, für die, die es interessiert:

    PHP
    preg_match_all("/\<\!-- MENU (\d*-?\d*\s*)--\>/", $this->sBody, $aMatches);
    for ($i = 0, $j = count($aMatches[0]); $i < $j; $i++)
    {
        $this->aMenuAreas[$i]['placeholder'] = $aMatches[0][$i];
        $this->aMenuAreas[$i]['level'] = trim($aMatches[1][$i]);
        $this->aMenuAreas[$i]['items'] = array();
    }

    Größer sind meine Templates dank CSS-Framework nicht...
    Es ist auch keine Template Engine, es werden einfach nur Bereiche in einem Template markiert die dann durch den eigentlichen Inhalt ersetzt werden. Nennts wie ihr wollt aber sicher kein Smarty.... :P

    Im Falle von <!-- MENU --> geb ich dem ganzen quasi nur noch mit welche Menüebene ausgegeben werden soll.
    <!-- MENU --> = alle
    <!-- MENU 1 --> = 1. Ebene
    <!-- MENU 2-4 --> = 2. - 4. Ebene
    <!-- MENU 3- --> = alle ab der 3. Ebene
    <!-- MENU -5 --> = alle bis zur 5.Ebene
    uswusf...

    Diese Flexibilität ist nunmal essentiell... auch wenn man selten mehr als 3 oder 4 Ebenen hat...
    da kommt ne regular expression halt besser, die ich mir inzwischen ja auch durch langes probieren erarbeitet habe! :P

    5 Mal editiert, zuletzt von FaFoo (7. Oktober 2010 um 17:22)

  • Zitat

    <body><div class="container_16 page" id="container_16"><div class="grid_16 menu area"><?php menu(1); ?>
    </div><div class="grid_16 header area"> 
    <?php menu(2-3); ?>
    <img src="/layout/simplegreen/img/header.jpg" />
    <?php area(1); ?>
    </div>


    Was bringt deine Engine nochmal?

  • PHP
    function __construct($sName)
    {
        $this->sName = $sName;
        $this->sHead = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/layout/" . $this->sName . "/tpl/head.html");
        $this->sBody = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/layout/" . $this->sName . "/tpl/body.html");
    }


    Frage beantwortet? :P
    Es findet kein HTTP Request auf die Templates statt...

  • Nein Frage nicht beantwortet, Frage verstanden?

    Was hat das nun mit HTTP Request zu tun?

    mfg

  • Der PHP Code wird nicht geparst...
    und cURL kann nicht verwendet werden.

    Die Templates werden halt in PHP per file_get_contents eingelesen und verarbeitet, also von einem Frontcontroller mit Inhalt befüllt.

    2 Mal editiert, zuletzt von FaFoo (7. Oktober 2010 um 17:46)

  • Hm... Output buffering FTW xD

    PHP
    <?php
    function load_template($file) {
        @ob_start();
        include($file);
        @$outputs=ob_get_contents();
        @ob_end_clean();
        return $outputs;
    }
    ?>

    Dann sieht ein template evtl so aus:

    per PHP:

    PHP
    echo load_template("template_abc.php");

    P.S.: In einem CMS das bereits output buffering nutzt, klappt das natürlich nicht.


    Soviel zu Templates. Wenn du aber an deiner RegExp festhälst, das müsste klappen:

    PHP
    $m=array();
    preg_match_all("/<!--MENU ([0-9]{1,2})(\-[0-9]{1,2}?)-->/", $template_quelle, $m);
    print_r($m);

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Ob PHP Code geparst wird oder nicht hat rein gar nix mit einen neuen HTTP Request zu tun

    Ich sagte es macht keinen Sinn macht, dass du dein Template mit PHP parsed, wenn du auch gleich im TPL deine FILE GET CONTENTS machst, bzw wenn dir das nicht "schön" genug ist eben eine Funktion machst die menu(),area() heist

    mfg

  • Hm... Output buffering FTW xD


    signed
    Hab ich schlicht nicht bedacht zu dem Zeitpunkt... könnte allerdings tatsächlich aus besagten Grund nicht möglich sein, weiß man aber noch nicht.

    @Pion: Deine Argumentation verstehe ich leider immer noch nicht ganz. Also ich versteh schon wie du es machen würdest, aber wieso mein weg keinen Sinn machen soll... versteh ich nicht.

    Genauso wenig wie:

    Zitat

    Ob PHP Code geparst wird oder nicht hat rein gar nix mit einen neuen HTTP Request zu tun


    Wovon denn dann?

  • Ich meinte das natürlich auch mit Bufferung (jede professionelle PHP Anwendung kommt um Buffern nicht herrum) !!!

    Eine PHP Anwendung hat im Normalfall nur 1 nen HTTP Request, wenn du mit file get contents oder per include was einbindest bleibt das trotzdem ein Request

    Dein Weg macht keinen Sinn, da du unnötig deine TPLs parst

    mfg