Reguläre Ausdrücke mit Optionen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reguläre Ausdrücke mit Optionen

    In einem Script soll ein Text à la:

    {news mode="short" start="1" limit="5" category="1" order="date" dir="desc"}

    durch den Inhalt einer Funktion ersetzt werden. Dies funktioniert mit untenstehendem Ausdruck auch Problemlos:

    $array[$an] = @preg_replace("/{cp:news mode=(.*) start=(.*) limit=(.*) category=(.*) order=(.*) dir=(.*)}/","addslashes(news(\\1,\\2,\\3,\\4,\\5,\\6))",$array[$an]);

    Jedoch sollen die Parameter "category", "order", und "dir" optional sein. D.h. es soll auch matchen, wenn der String z.B. so aussieht:

    {news mode="short" start="3" limit="8"}

    Wie kann dies realisiert werden? Auch das Backreferenzing muss dann ja wahrscheinlich geändert werden, oder?
    Contentpapst 3.1 - Der Preisbrecher unter den Content-Management-Systemen
    www.contentpapst.de / WYSIWYG-Editor, Rechtesystem, eigene Module per GUI... // Demoversion
    [color=red]Ab sofort in Version 3.1![/color] / dazu auch Standalone Shop-System CP::Shop uvm.

  • #2
    Weiss da keine eine Antwort drauf? Ist sicherlich schon ein wenig schwieriger, aber ich denke auch für andere User hier nützlich, wenn es dafür eine praktische Lösung gibt.
    Contentpapst 3.1 - Der Preisbrecher unter den Content-Management-Systemen
    www.contentpapst.de / WYSIWYG-Editor, Rechtesystem, eigene Module per GUI... // Demoversion
    [color=red]Ab sofort in Version 3.1![/color] / dazu auch Standalone Shop-System CP::Shop uvm.

    Kommentar


    • #3
      easy ...

      $array[$an] = @preg_replace("/{cp:news mode=(.*) start=(.*) limit=(.*) (category=(.*))? (order=(.*))? (dir=(.*))?}/", "addslashes(news(\\1,\\2,\\3,\\4,\\5,\\6))", $array[$an]);

      einfach die optiontalen Teile mit (xxx)? umschließen
      mein Sport: mein Frühstück: meine Arbeit:

      Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

      Kommentar


      • #4
        Nope, damit scheints leider nicht zu gehen, bei folgendem im Template:

        Code:
        {cp:news mode="short" start="1" limit="5" category="1" order="date" dir="desc"}
        {cp:news mode="short" start="1" limit="5" category="1" order="date"}
        {cp:news mode="short" start="2" limit="4"}
        wird folgendes Ausgegeben:

        Code:
        addslashes(news("short","1","5",category="1","1",order="date"))
        {cp:news mode="short" start="1" limit="5" category="1" order="date"}
        {cp:news mode="short" start="2" limit="4"}
        D.h. Nr.1 mit allen Angaben geht nicht und die anderen Tags werden gar nicht beachtet.
        Contentpapst 3.1 - Der Preisbrecher unter den Content-Management-Systemen
        www.contentpapst.de / WYSIWYG-Editor, Rechtesystem, eigene Module per GUI... // Demoversion
        [color=red]Ab sofort in Version 3.1![/color] / dazu auch Standalone Shop-System CP::Shop uvm.

        Kommentar


        • #5
          hab mich etwas gespielt und nen workaround gebastelt *hehe*

          PHP-Code:
          //$str = "{news mode=\"short\" start=\"1\" limit=\"5\" category=\"1\" order=\"date\" dir=\"desc\"}";
          $str "{news mode=\"short\" start=\"1\" limit=\"5\" category=\"1\" order=\"date\"}";
          //$str = "{news mode=\"short\" start=\"1\" limit=\"5\" dir=\"desc\"}";

          echo preg_replace("/{([a-z]+) (.*)}/e""addslashes(\\1('\\2'))"$str);

          function 
          news($options) {

            foreach (
          explode(" "$options) as $option) {

              
          preg_match("/(.*)=(.*)/"$option$args);
              
          $key $args[1];
              
          $value $args[2];
              
              $
          $key stripslashes($value);

            }

            unset(
          $options); unset($option); unset($args); unset($key); unset($value);
            
          print_r(get_defined_vars());

            return 
          false;


          Code:
          Array
          (
              [mode] => "short"
              [start] => "1"
              [limit] => "5"
              [category] => "1"
              [order] => "date"
          )
          das unset kannst natürlich weglassen, ich hab die temporären variablen nur gelöscht um die ausgabe auf das wesentliche zu beschränken ..

          ps: es geht hier sicherlich um dein cms .. bitte mir eine kopie zukommen lassen =) (vorher pm schreiben oder so ..)
          mfg,
          [color=#0080c0]Coragon[/color]

          Kommentar

          Lädt...
          X