Verschachtelung bei regulärem Ausdruck

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

  • Verschachtelung bei regulärem Ausdruck

    Guten Morgen erstmal.

    Ich habe folgendes Problem:
    Mit diesem Regulären Usdruck möchte ich die Namen herausfiltern (preg_match_all)
    Code:
    /\[quote=(.+)\](?:.+)\[\/quote\]/
    Das klappt bei einem einzelnen Tag-Paar auch soweit ganz gut, nur mit verschaltelten Tags hat er so seine Probleme.

    Hat vielleicht jemand eine Idee oder einen Ansatz?
    mfg

  • #2
    Könntest du mir den Gefallen tun und ein paar Beispiele posten? Also wo es klappt und wo es nicht klappt und was du dort gerne matchen würdest.
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      Code:
      [quote=fun.baker][quote=test]ahgf[/quote][/quote]
      somethin other space
      [b ]bold[ /b]
      [ i]italic[ /i]
      [quote=test][b ]somethin other[ /b][/quote]
      
      array(2) {
        [0]=>
        array(2) {
          [0]=>
          string(49) "[quote=fun.baker][quote=test]ahgf[/quote][/quote]"
          [1]=>
          string(40) "[quote=test][b]somethin other[b][/quote]"
        }
        [1]=>
        array(2) {
          [0]=>
          string(21) "fun.baker][quote=test"
          [1]=>
          string(7) "test][b"
        }
      }
      
      
      
      array(2) {
        [0]=>
        string(9) "fun.baker"
        [1]=>
        string(4) "test"
      }
      Ganz oben ist ein Textbeispiel //bearbeitet, damit der bbcode nicht geparset wird
      In der Mitte das, was preg_match_all mir liefert dazu.
      Und unten die inzwischen gefundene Problemlösung per explode()... etwas unsauber wie ich finde aber es geht..,
      Wäre natürlich trotzdem besser, das ganze nur per Regex zu lösen

      Der Code dazu:
      PHP-Code:
      <?php
      ini_set
      ('ERROR_REPORTING''ON');
      $regex '/\[quote=(.+)\](?:.+)\[\/quote\]/';
      $test '[quote=fun.baker][quote=test]ahgf[/quote][/quote]
      somethin other space
      [b]bold[(b]
      [i]italic[/i]
      [quote=test][b]somethin other[b][/quote]
      '
      ;
      preg_match_all($regex$test$match);
      header('Content-type: text/plain');
      echo 
      $test;
      echo 
      "\n";
      var_dump($match);

      echo 
      "\n\n\n";
      $results = array();
      foreach (
      $match[1] as $matches)
      {
          
      $arr explode(']'$matches);
          
      $results[] = $arr[0];
      }
      var_dump($results);
      ?>
      Hier verschluckt das Forum die Slashes...

      Kommentar


      • #4
        Ich hatte das damals mit preg_replace_callback gelöst. Ich weiß nicht genau, ob eine andere Lösung überhaupt möglich ist!

        Kommentar


        • #5
          Original geschrieben von PHP-Desaster
          Ich hatte das damals mit preg_replace_callback gelöst. Ich weiß nicht genau, ob eine andere Lösung überhaupt möglich ist!
          Ich möchte den BBCode zwar (noch nicht) Parsen, aber bei diesem Vorhaben wird die Funktion nützlich sein. Das wäre mein nächstes Problem gewesen

          Mein eigentliches Problem war es, die zitierten Namen herauszufiltern.
          Auf der ersten Ebene klappt das mit explode() ja ganz gut,
          aber auch hier gibt er danach bei verschachtelungen den Geist auf.

          Danke trotzdem für die Hilfe bis jetzt

          Kommentar


          • #6
            Möglicherweise rekursive Regex?

            PHP Manual - Pattern Syntax unter Recursive patterns
            und
            PHP Manual - preg_replace_callback Beispiel eines rekursiven Musters unter Examples

            Grüße
            Nieder mit der Camel Case-Konvention

            Kommentar


            • #7
              Danke, ich werde mir das sobald wie möglich anschauen

              Kommentar

              Lädt...
              X