preg_replace - Gibts dafür ne besser Lösung?

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

  • preg_replace - Gibts dafür ne besser Lösung?

    Hi Leute,

    ich versuche mich an regulären Ausdrücken und tue mich damit noch recht schwer. Ich lese PHP-Dateien aus und möchte den ersten PHP-String?! (<? oder <?php) ersetzen.

    Ich löse das wie folgt

    $in = preg_replace("(^<\?(php)?)", "", $in,1);

    es funktioniert auch, allerdings bin ich mir unsicher das es eine zuverlässige bzw. fehlerfreie Lösung ist.

    Würdet Ihres anders machen?

    ThX

  • #2
    Re: preg_replace - Gibts dafür ne besser Lösung?

    Würdet Ihres anders machen?
    ja.

    - sollen die äußeren klammern als delimiter herhalten?
    - modifier i noch dazu ...

    achso: wenn du den ersten <?... ersetzen willst, würde ich das ^ entfernen, sonst ersetzt du es nur, wenn es ganz am anfang steht.
    Zuletzt geändert von derHund; 27.09.2004, 20:45.
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      es funktioniert auch, allerdings bin ich mir unsicher das es eine zuverlässige bzw. fehlerfreie Lösung ist.
      Falls Du PHP-Code aus fremden Quellen zuverlässig parsen können willst, müßtest Du theoretisch noch die Notation <SCRIPT LANGUAGE="PHP"> in all ihren möglichen Schreibweisen berücksichtigen. Wird in der Praxis soweit ich sehe allerdings kaum benutzt, nur als Anmerkung der Vollständigkeit halber.

      Kommentar


      • #4
        @derHund

        da sieht man gleich wer ein alter Hase ähhhm Hund ist
        klappt soweit wunderbar mit

        $in = preg_replace("(<\?(php)?)i", "", $in,1);

        Ob die Klammern als Delimer herhalten sollen *schluck* weiss ich nicht. Ich habe probiert wie es geht und anders z.B. so

        $in = preg_replace("/<\?(php)?/i", "", $in,1);

        klappt es nicht.

        @pekka
        danke für den Tip aber ich mache mich an einfachen sachen schon tot und weiss net wie ichs hinbekommen soll... RegEX drives me crazy.


        NOCH EIN PROBLEM

        ich will alle Kommentare // finden die ein Zeichen vorangestellt haben ausser ein Leerzeichen oder eben am Anfang der Zeile

        Meine Lösung

        $in = preg_replace( '/\S\/\//', "", $in);

        Klappt auch nur Kommentare mit /// entfernt er auch, obwohl er die nicht entfernen soll.

        Ufff kann jemand helfen?

        Kommentar


        • #5
          Ob die Klammern als Delimer herhalten sollen *schluck* weiss ich nicht.
          war nur etwas verwirrend ...
          und anders z.B. so [...] klappt es nicht.
          hmm, sollte schon ...
          nur Kommentare mit /// entfernt er auch, obwohl er die nicht entfernen soll.
          setz doch noch eine bedingung dran, daß ein drittes / nicht gefunden wird ... so?
          Code:
          #\S//[^/]#
          ungetestet.
          Die Zeit hat ihre Kinder längst gefressen

          Kommentar


          • #6
            @derHund

            danke für deine Mitarbeit. Allerdings bringt mich dein Lösungsansatz nicht weiter.

            Ich lese eine php-Datei und lasse Kommentare entfernen. Das klappt auch wunderbar sofern das // am Anfang einer Zeile steht bzw ein Leerzeichen davor ist wenn es nach einem Code als Kommentar kommt. Durch eine Suchroutine will ich die PHP-Datei vorab durchsuchen wo das // sofort auf ein Zeichen (ohne Leerzeichen und nicht am Zeilenanfang) folgt.

            Beispiel:

            <?
            // Test1
            echo "text"; /////Test2
            echo "text";//Test3
            //Test4
            ;/////////Test5
            ?>

            Gefunden werden muss Test3 und Test5 da diese kein Leerzeichen vor dem // haben bzw. nicht am Zeilenanfang stehen.

            Ich will im Script eingeintlich nur sowas ausgeben wie

            "Line 4 und 6 von test.php entsprechen nicht dem Standard"

            Aber wie *verzweifel*

            Kommentar


            • #7
              Gefunden werden muss Test3 und Test5 da diese kein Leerzeichen vor dem // haben bzw. nicht am Zeilenanfang stehen.
              der regexp
              Code:
              &[^\s/](/){2,}[^/]&i
              tut das, zumindest bei deinen beispielen ...
              "Line 4 und 6 von test.php entsprechen nicht dem Standard"
              wie kommst du an die zeilennummer? überprüfst du jede zeile einzeln?
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                die php-datei wird als ein array eingelesen. jetzt soll zeilenweise verglichen werden ob &[^\s/](/){2,}[^/]&i zutrifft. wenn ja soll ausgegeben werden in welcher zeile.

                danke für deine mühe

                Kommentar


                • #9
                  Original geschrieben von joop
                  Gefunden werden muss Test3 und Test5 da diese kein Leerzeichen vor dem // haben bzw. nicht am Zeilenanfang stehen.
                  wenn du nur darauf schaust, wirst du beispielsweise mit
                  PHP-Code:
                  header('Location: http://www.example.com/'); 
                  ein problem kriegen ...
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Hi Leute,

                    Eure Tips haben mir sehr geholfen
                    @wahsaga - daran habe ich nicht gedacht und alle Domains http:// ftp:// und https:// mit eingeflochten.

                    Jetzt habe ich noch ein Problem und Hund weiss sicher weiter *fg*

                    Ich will die Regeln für RegEx mit nem Webformular übergeben und einiges probiert aber nichts klappt.

                    In ein HTML-Textfeld trägt der User ein was vor einem Zeichen ausgeschlossen werden soll getrennt mit einem |.

                    Er trägt zum Beispiel ein

                    $|=|%

                    $comment2_rule = explode("|",htmlentities($comment2_rule));
                    $comment2_rule = implode("\\",$comment2_rule);
                    $pattern2 = $pattern2 . "\\".$comment2_rule;

                    preg_match("![$pattern2]\#[^\n]!", $zeile, $txt)

                    Nur kommt das $pattern2 nicht in der Formel an wie es soll. Trage ich bei preg_match für $pattern2 z.B. ein \$\=\% läuft alles wie geschmiert.

                    Ideen???

                    Kommentar


                    • #11
                      was bekommst Du denn wenn Du "echo $pattern2" machst?
                      Müßte ja eigentlich "\$\=\%" ergeben.

                      Wo kommt $comment2_rule her?
                      [Test] MySQL cli Emulator

                      Kommentar


                      • #12
                        echo ist vor und nach explod so wies sein soll. $comment2_rule kommt aus einem feld des html-formulars.

                        Kommentar


                        • #13
                          also "echo $pattern2" bringt das erwartete? Also "\$\=\%"
                          Zuletzt geändert von NielsRunge; 29.09.2004, 18:45.
                          [Test] MySQL cli Emulator

                          Kommentar


                          • #14
                            ja

                            Kommentar


                            • #15
                              hmm, komisch, und am Regex selber liegt es ja nicht, hattest ja geschrieben dass es funktioniert wenn Du anstatt $pattern2 "\$\=\%" verwendest.
                              [Test] MySQL cli Emulator

                              Kommentar

                              Lädt...
                              X