Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage wegen preg_replace Lookahead / Lookbehind

Einklappen

Neue Werbung 2019

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

  • Frage wegen preg_replace Lookahead / Lookbehind

    Ich möchte aus einer html-Datei einige Script-Tags ersetzen mit preg_replace, allerdings z.b. Keines welches den Text 'compressed' enthält.



    PHP-Code:
    $pattern '/\<script .*(?!compressed)<\/script>/';
    $ausgabe preg_replace($pattern'-SCRIPT'$subject); 


    Dieses soll die Funktion nicht ersetzen:
    HTML-Code:
    <script type="text/javascript" src="/compressed/head-02c9554333fdc910ef73aec9a.merged.gz.js"></script>


    Mein Problem ist, dass mein preg_replace immer trifft (und ersetzt), auch mit diesen patterns:
    PHP-Code:
    $pattern '/\(<script).*(?!compressed).*<\/script>/';
    $pattern '/\(<script).*(?<!compressed).*<\/script>/';
    $pattern '/\(<script).*(?!compressed).*(<\/script>)/';
    $pattern '/\(<script).*(?<!compressed).*(<\/script>)/'


    Diese werden korrekt ersetzt:
    HTML-Code:
    <script type="text/javascript" src="/some-url/jquery-geturlparam.js"></script>
    <script type="text/javascript" src="/some-url/some-script.js"></script>
    <script type="text/javascript" src="/some-url/some-script2.js"></script>


    Hat jemand von euch die zündende Idee warum mein Lookahead / Lookbehind nicht funktioniert? Ich nutze PHP 5.4.

    Über Lösungsvorschläge wäre ich sehr dankbar.

    LG r4w

  • #2
    Warum kein xpath?

    Kommentar


    • #3
      Da gibt es m.E. kein RegEx, der das in einen Rutsch erledigt.
      Zu den Look-around assertions: Es gibt dort look-ahead assertions und look-behind assertions. Was du haben möchtest könnte man als look-contain assertion bezeichnen, die gibt es nicht.
      xpath ist schon die richtige Marschrichtung, sehe ich auch so. Such mal hier im Forum, ich glaube hausl hat erst kürzlich ein Beispiel gepostet.

      Kommentar


      • #4
        Ging um den? http://www.php.de/forum/webentwicklu...90#post1432490

        Mit einem angepassten XPath kannst du die zB so greifen:

        PHP-Code:
        $html =
        '<html><head>
        <script type="text/javascript" src="/some-url/jquery-geturlparam.js"></script>
        <script type="text/javascript" src="/compressed/head-02c9554333fdc910ef73aec9a.merged.gz.js"></script>
        <script type="text/javascript" src="/some-url/some-script.js"></script>
        <script type="text/javascript" src="/some-url/some-script2.js"></script>
        </head></html>'
        ;

        $dom = new DOMDocument();
        $dom->loadHTML($html);

        $xpath = new DOMXpath($dom);
        $elements $xpath->query('//script[not(contains(@src, "compressed"))]');

        foreach(
        $elements as $element) {
            echo 
        $element->getAttribute('type') . " " $element->getAttribute('src') . "<br>";
        }
        /*
         text/javascript /some-url/jquery-geturlparam.js
         text/javascript /some-url/some-script.js
         text/javascript /some-url/some-script2.js
        */ 

        Siehe auch:
        http://php.net/manual/en/domelement.setattribute.php
        etc...
        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
          Vielen Dank für eure zahlreichen Antworten.

          Werde es mir mal über Ostern zu Gemüte führen!

          Frohe Ostern und erholsame Feiertage wünsche ich euch

          Kommentar

          Lädt...
          X