J.Hahn: preg_match_all: Unterschied zwischen PHP 4und 5??

Hallo,

habe das Phänomen, dass ein mit preg_match_all angewendeter regulärer Ausdruck unter PHP4 prima funktioniert, unter PHP5 aber die Arbeit verweigert. Gibt es da Unterschiede in den Versionen??

Hier der Ausdruck:
$regexp = '/{([^:(}]*)((.*?)))?}(.*){end(\1)}/is';

Soll sowas finden (und findet in PHP4 auch, aber nicht in PHP5 ;-)):
$string = '... {FUNCTION1 (vars)}beliebiger Text{ENDFUNCTION1} ...';

Und zwar so:
preg_match_all ($regexp, $string, match);

Weiß jemand vielleicht, ob sich was geändert hat in PHP5 bei den regulären Ausdrücken und falls ja, wo der Unterschied liegt?

Danke und Grüße, Josef

  1. hi,

    habe das Phänomen, dass ein mit preg_match_all angewendeter regulärer Ausdruck unter PHP4 prima funktioniert, unter PHP5 aber die Arbeit verweigert.

    Was heisst funktionieren, und was Arbeit verweigern, sprich -

    Gibt es da Unterschiede in den Versionen??

    Hier der Ausdruck:
    $regexp = '/{([^:(}]*)((.*?)))?}(.*){end(\1)}/is';

    Soll sowas finden (und findet in PHP4 auch, aber nicht in PHP5 ;-)):
    $string = '... {FUNCTION1 (vars)}beliebiger Text{ENDFUNCTION1} ...';

    Und zwar so:
    preg_match_all ($regexp, $string, match);

    Wenn ich da vor's match noch ein $ setze, und mir dann $match mit print_r ausgeben lasse, erhalte ich unter 5.2.3 folgendes:

    Array
    (
        [0] => Array
            (
                [0] => {FUNCTION1 (vars)}beliebiger Text{ENDFUNCTION1}
            )

    [1] => Array
            (
                [0] => FUNCTION1
            )

    [2] => Array
            (
                [0] =>  (vars)
            )

    [3] => Array
            (
                [0] =>  (vars
            )

    [4] => Array
            (
                [0] => beliebiger Text
            )

    [5] => Array
            (
                [0] => FUNCTION1
            )

    )

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. ... er nun wieder. Was ist denn da nicht verständlich, wenn ich schreibe, dass der reguläre Ausdruck unter PHP5 (5.2) nicht funktioniert???

      Allerdings bin ich jetzt baff, dass Du beim test genau das rausbekommst, was rauskommen sollte, nämlich das Array mit den Treffern. Auf meinem Webserver mit PHP 5.2 kommt mit haargenau dem gleichen Quelltext folgendes bei raus:

      Array
      (
          [0] => Array
              (
              )

      [1] => Array
              (
              )

      [2] => Array
              (
              )

      [3] => Array
              (
              )

      [4] => Array
              (
              )

      [5] => Array
              (
              )

      )

      Verwirrte Grüße, Josef

      1. hi,

        Was ist denn da nicht verständlich, wenn ich schreibe, dass der reguläre Ausdruck unter PHP5 (5.2) nicht funktioniert???

        "Funktioniert nicht" ist und bleibt Bullshit.

        Beschreibe, was du erwartest, und was du stattdessen bekommst.

        Allerdings bin ich jetzt baff, dass Du beim test genau das rausbekommst, was rauskommen sollte, nämlich das Array mit den Treffern. Auf meinem Webserver mit PHP 5.2 kommt mit haargenau dem gleichen Quelltext folgendes bei raus:

        Schau an, du bekommst also ein Array, das zwar Elemente enthält, die aber leer sind.
        Und diese Information glaubst du sinnvoll in einem stupiden "funzt nicht" untergebracht zu haben?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. gudn tach!

    liefert exakt dieser code

      
    <?php  
      $string = '... {FUNCTION1 (vars)}beliebiger Text{ENDFUNCTION1} ...';  
      $regexp = '/\{([^:(}]*)((.*?)\))?\}(.*)\{end(\\1)\}/is';  
      $match = '';  
      preg_match_all($regexp, $string, $match);  
      print_r($match);  
    ?>
    

    unterschiedliche ergebnisse in deinen php-versionen?

    prost
    seth

    1. N'Abend,

      müsste ich morgen mal ausprobieren. Allerdings habe ich das nun mit einem anderen regulären Ausdruck gelöst.

      Problem war nämlich, dass in manchen $string, die z.B. so aussahen:

      $string = "{IF1}blala{MAKROOHNEEND}blabala{ENDIF1}...davon ein ganzer Haufen{IF18}noch mehr {MAKROOHNEEND}{ENDIF18}";

      also viele Makros enthielten PHP5 irgendwann mal in der Funktion preg_last_error() einen PREG_BACKTRACK_LIMIT_ERROR meldete, weil wohl die Anzahl der Backtracks 10000 überschritten hatte.
      Kam mit diesem Suchmuster bei $string mit vielen Makros (vorallem einfache wie "{MAKROOHNEEND}") vor.
      Interessant dabei ist nur, dass dieses "Problem" in PHP4 schnuppe war. Da konnte $string soviel Makros enthalten, wie es wollte. PHP4 hat das nicht gejuckt, es wurden immer alle gefunden!?

      Danke dennoch für den Tipp. Cheers, Josef