Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP 7 regulärer Ausdruck

Einklappen

Neue Werbung 2019

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

  • PHP 7 regulärer Ausdruck

    Hallo leute,

    nach der Umstellung von php 5 auf PHP7 funktioniert bei mir ein Codeschnipsel nicht mehr, preg_last_error liefert mir die neue Konstante PREG_JIT_STACKLIMIT_ERROR

    Ich führe folgenden regex aus

    PHP-Code:
    $regex '/<!-- START_SNIPPET:part1 -->((.|\s)*)<!-- END_SNIPPET:part1 -->/U'
    hier könnt ihr den gleichen Code in php 5 ausprobieren und es wird funktionieren.

    http://sandbox.onlinephpfunctions.co...622db1b599cacb


    Jetzt mal unabhängig davon dass der HTML COde hässlich ist und man nicht im HTML Code per regex irgendwas suchen sollte, finde ich das schon krass.

    Vielleicht kennt jemand die Lösung dafür? Aktuell muss ich den Code umschreiben auf strpos usw.

    Vielleicht hat ja jemand auch das gleiche Problem und ich hoffe ich konnte demjenigen das Stundenlange Debungging ersparen.

    LG
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

  • #2
    Zitat von BlackScorp Beitrag anzeigen
    nach der Umstellung von php 5 auf PHP7 funktioniert bei mir ein Codeschnipsel nicht mehr, preg_last_error liefert mir die neue Konstante PREG_JIT_STACKLIMIT_ERROR

    hier könnt ihr den gleichen Code in php 5 ausprobieren und es wird funktionieren.

    http://sandbox.onlinephpfunctions.co...622db1b599cacb
    Der selbe Code funktioniert auch unter PHP7!

    https://eval.in/private/f04e6a989006b0

    PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

    Kommentar


    • #3
      Zitat von Ulfikado Beitrag anzeigen

      Der selbe Code funktioniert auch unter PHP7!

      https://eval.in/private/f04e6a989006b0
      bei uns auf dem Server nicht und hier auch nicht http://sandbox.onlinephpfunctions.co...622db1b599cacb


      wir haben PHP Version 7.0.22-0ubuntu0.16.04.1 und pcre hab ich gerade mit eval.in vergleichen, ist die gleiche Version. Ich finds strange
      apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

      Kommentar


      • #4
        Zitat von BlackScorp Beitrag anzeigen
        Vielleicht kennt jemand die Lösung dafür? Aktuell muss ich den Code umschreiben auf strpos usw.

        The new PREG_JIT_STACKLIMIT_ERROR constant introduced with PHP 7.0.0 has got a value of 6.

        I experienced this error code when parsing a 112KB file. preg_match_all failed with this error. Interesting was: The matches array contained some entries, but not all as the command failed (I missed to check the return value).

        Unfortunately you can not configure the stack-size of the PCRE JIT. The only way out was - at least for me - to disable the PCRE JIT via php.ini (pcre.jit=0).
        http://php.net/manual/de/pcre.constants.php#118538
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Häng da mal als modifier ein s dran und match mit (.*). Nur aus Intresse...

          Kommentar


          • #6
            ne, das ist mir schon klar, nur war das echt nicht leicht herauszufinden
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

            Kommentar


            • #7
              BlackScorp

              Zitat von BlackScorp Beitrag anzeigen
              Vielleicht kennt jemand die Lösung dafür? Aktuell muss ich den Code umschreiben auf strpos usw.
              Bezug mich darauf.
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Zitat von erc Beitrag anzeigen
                Häng da mal als modifier ein s dran und match mit (.*). Nur aus Intresse...
                Vorher: https://regex101.com/r/LBhjAb/1/ 45258 steps, ~44ms

                Nachher: https://regex101.com/r/pflMPR/1 22967 steps, ~23ms


                Was ich gefunden habe, kann man den Werte nur beim Kompilieren ändern. Dh entweder Regex optimieren, oder andere PHP-Funktionen verwenden, oder PCRE JIT per php.ini deaktivieren.

                zB
                https://stackoverflow.com/questions/...ack-limit-php7
                http://php.net/manual/de/pcre.configuration.php
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Zitat von hausl Beitrag anzeigen

                  Vorher: https://regex101.com/r/LBhjAb/1/ 45258 steps, ~44ms

                  Nachher: https://regex101.com/r/pflMPR/1 22967 steps, ~23ms


                  Was ich gefunden habe, kann man den Werte nur beim Kompilieren ändern. Dh entweder Regex optimieren, oder andere PHP-Funktionen verwenden, oder PCRE JIT per php.ini deaktivieren.

                  zB
                  https://stackoverflow.com/questions/...ack-limit-php7
                  http://php.net/manual/de/pcre.configuration.php
                  wenn man JIT Deaktiviert, springt der Code nicht rein und es wird beendet, selbst der Debugger ist rausgesprungen und code wurde nicht weiter ausgeführt. Also da bleibt halt wirklich nur Optimierung
                  apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                  Kommentar


                  • #10
                    Das finde ich irgendwie erschreckend. ALso nicht die Tatsache das man besser optimierte Ausdrücke nutzt. Das finde ich OK. Aber diese Änderung in einem PHP passt irgendwie nicht zum bisherigen Umgang mit solch u.U. einschneidenden Dingen.

                    Nur mal so als Beispiel. Zwischen der Ankündigung das short_open_tags standard nicht mehr On ist und der finalen Umsetzung sind fast 2 Jahre und zahlreiche öffentliche Diskusionen ins Land gegangen. Und das ist nur eine Änderung die man bei Problemen einfachst beheben kann. Aber diese Änderung ist nix was mal fix mit search & replace beheben kann. Und automatismen gibts dazu auch nicht. Und das alles ohne große diskusionen, zumindest ist mir nix dazu aufgefallen.

                    Das macht mir "Angst".

                    PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                    Kommentar


                    • #11
                      Was hat Dich denn z.B. zwei Jahre daran gehindert, short_open_tags explizit auf On zu setzen in Deinen Projekten ( in denen Du das benötigst )?
                      Ich finde, dass eine Ankündigung schon zur Anpassung seiner Scripte ermutigen sollte. Wer wartet, bis es umgesetzt wurde, hat die Zeit dazwischen verschlafen und ist imho selbst schuld.
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Zitat von hausl Beitrag anzeigen

                        Vorher: https://regex101.com/r/LBhjAb/1/ 45258 steps, ~44ms

                        Nachher: https://regex101.com/r/pflMPR/1 22967 steps, ~23ms


                        Was ich gefunden habe, kann man den Werte nur beim Kompilieren ändern. Dh entweder Regex optimieren, oder andere PHP-Funktionen verwenden, oder PCRE JIT per php.ini deaktivieren.

                        zB
                        https://stackoverflow.com/questions/...ack-limit-php7
                        http://php.net/manual/de/pcre.configuration.php
                        deine Lösung geht nicht (geht nur in php 5.x und regex101 scheint auch php 5.x zu nutzen)

                        http://sandbox.onlinephpfunctions.co...622db1b599cacb

                        ich finde jetzt garnichts, also die Optimierung bringt da nichts. das Ziel ist eigenltlich Banal, finde den Inahlt der zwischen <!-- START_SNIPPETart1 --> und <!-- END_SNIPPETart1 --> steht

                        JIT deaktivieren, lässt den Script abbrechen. preg_match_all arbeitet dabei wie die()

                        PS: ich poste ja hier nicht einfach so sachen ohne dass ich es vorher ausgiebig getestet habe

                        EDIT: ich sehe gerade, ich habe den Modifier "s" übersehen.. damit gehts, ich habe aber jetzt mein Script umgeschrieben auf strpos usw ich reverte mal
                        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                        Kommentar


                        • #13
                          Ist es das nicht was du willst? http://sandbox.onlinephpfunctions.co...92f774dc0bf4d9

                          Ich habe...

                          - ini_set() auskommentiert

                          - NOWDOC statt HEREDOC genommen sonst viele Notices.. kannst du dann ja anders machen

                          - /s ergänzt und (.*) in der Mitte als Ausdruck genommen


                          => matches[1][0] scheint den gewünschten String zu erhalten (schau bitte mal). Wenn es das eh nur einmal gibt, kannst du auch nur preg_match() verwenden und dann reicht matches[1].
                          The string "()()" is not palindrom but the String "())(" is.

                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Zitat von hausl Beitrag anzeigen
                            Ist es das nicht was du willst? http://sandbox.onlinephpfunctions.co...92f774dc0bf4d9

                            Ich habe...

                            - ini_set() auskommentiert

                            - NOWDOC statt HEREDOC genommen sonst viele Notices.. kannst du dann ja anders machen

                            - /s ergänzt und (.*) in der Mitte als Ausdruck genommen


                            => matches[1][0] scheint den gewünschten String zu erhalten (schau bitte mal). Wenn es das eh nur einmal gibt, kannst du auch nur preg_match() verwenden und dann reicht matches[1].
                            jo alles richtig was du sagst, hab mit (.*) probiert aber ohne /s und desswegen ging es nicht. Schon scheiße fremden regex zu debuggen und der Fehler tritt ja auch nur ab einer bestimmen Größe auf. In dem HTML Document hab ich da noch part2 und part3 usw drin, alle parts wurden mit dem alten regex gefunden nur bei part1 ist er wegen JIT ausgestiegen.
                            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                            Kommentar


                            • #15
                              Zitat von Arne Drews Beitrag anzeigen
                              Was hat Dich denn z.B. zwei Jahre daran gehindert, short_open_tags explizit auf On zu setzen in Deinen Projekten ( in denen Du das benötigst )?
                              Nichts hat mich gehindert, Darum ging es mir aber in keiner Weise! Es ging mir darum das die entwickler wegen so nem Kleinkram wie eben short_open_tags so viel Diskutiert haben aber bei einer viel schwerwiegenden Änderung wie das angesprochen PCRE Zeugs kaum ein Wort drüber verlieren. (Das changelog mal außen vor) Das steht irgendwie in keiner relation zueinander!

                              PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                              Kommentar

                              Lädt...
                              X