Phil: preg_match Suchmuster nicht im Ergebnis anzeigen

Hallo zusammen

Ich verwende folgenden Code um einen gewissen Teil einer URL auszulesen.

preg_match("/http://(.*)\?/i", $results[0], $result);

Originale URL: http://www.test.de?id=1
Das Ergebnis des Code: http://www.test.de?

Ich hätte aber gerne, dass die Suchmuster nicht im Ergebnis landen. Soll heissen.

Gewünschtes Resultat: www.test.de

Wie kann ich preg_match so abändern, dass die Suchmustern nicht im Ergebnis angezeigt werden? Danke!

  1. Hallo Phil,

    Ich verwende folgenden Code um einen gewissen Teil einer URL auszulesen.
    preg_match("/http://(.*)\?/i", $results[0], $result);

    warum?

    Originale URL: http://www.test.de?id=1

    Bitte *nicht* existierende Domains für Beispiele verwenden, sondern die dafür vorgesehenen Beispieldomains.

    Gewünschtes Resultat: www.test.de

    Wie kann ich preg_match so abändern, dass die Suchmustern nicht im Ergebnis angezeigt werden? Danke!

    parse_url() statt preg_match() verwenden.

    Freundliche Grüße

    Vinzenz

    1. Danke für Deine Antwort! Sorry für meinen Fehler.

      Ich möchte lieber preg_match verwenden. Kleine zusätzliche Frage, wie erweitere ich den Code, wenn ich möchte, dass er alles zwischen http:// und ? kopiert, aber nur wenn dort das Suchmuster "test" vorkommt?

      Danke und Gruss, Philipp

      1. Hallo,

        Danke für Deine Antwort! Sorry für meinen Fehler.

        Ich möchte lieber preg_match verwenden.

        Warum?

        Kleine zusätzliche Frage, wie erweitere ich den Code, wenn ich möchte, dass er alles zwischen http:// und ? kopiert, aber nur wenn dort das Suchmuster "test" vorkommt?

        auf das Arrayelement mit dem Schlüssel host des Rückgabewertes von parse_url die Funktion substr() anwenden :-)

        Ok, Du willst ja preg_match() verwenden:

        Du suchst die Zeichenfolge http:// (wobei Du den Slash escapen musst, wenn Du den Slash als Delimiter verwendest), gefolgt von dem was Du einfangen willst - und deswegen in runde Klammern setzt - wobei dieses aus einer beliebig vielen (auch null) beliebigen Zeichen besteht, gefolgt von der Zeichenkette test, gefolgt von beliebig vielen (auch null) beliebigen Zeichen. Nicht mehr fangen willst Du das folgende Fragezeichen, wobei Du davon ausgehst, dass in Deiner Zeichenkette das Fragezeichen nur einmal vorkommt:

          
        $result    = array();  
        $haystack  = 'http://test.example.org?id=1';  
          
        $pattern   = '/http:\/\/(.*test.*)\?/i';  
        # /          # wir beginnen den Ausdruck (jeder andere Delimiter wäre besser)  
        # http:\/\/  # gefolgt von  http://  
        # (          # wir beginnen einzufangen  
        # .*         # beliebig viele (auch 0) beliebige Zeichen  
        # test       # die Zeichenfolge test  
        # .*         # beliebig vielen (auch 0) weiteren beliebigen Zeichen  
        # )          # wir beenden das Einfangen  
        # \?         # gefolgt von einem Fragezeichen  
        # /i         # wir suchen ohne Beachtung der Groß- und Kleinschreibung  
          
        preg_match($pattern, $haystack, $result);  
        // Es ist nicht unbedingt eine gute Idee, die Variable, in der wir suchen,  
        // mit dem Inhalt des Ergebnisses zu überschreiben.  
          
        // Testausgabe unter Beachtung des HTML-Kontextes  
        // in einem pre-Element zur besseren Lesbarkeit  
        echo "<pre>\n";  
        echo htmlspecialchars(print_r($result, true));  
        echo "</pre>\n";
        

        Ach ja:
        modifiziere bitte den Inhalt von $haystack, so dass dieser mehr als ein Fragezeichen enthält:

        $haystack  = 'http://test.example.org?id=1?foo=bar';

        und schau Dir das Resultat an ...
        gierig und genügsam wären Stichwörter für Deine Suche.

        Freundliche Grüße

        Vinzenz

  2. Originale URL: http://www.test.de?id=1
    Das Ergebnis des Code: http://www.test.de?

    Ich hätte aber gerne, dass die Suchmuster nicht im Ergebnis landen. Soll heissen.

    Gewünschtes Resultat: www.test.de

    RTFM
    "Falls der Parameter matches angegeben wurde, wird er mit den Suchergebnissen gefüllt. $matches[0] enthält dann den Text, der auf das komplette Suchmuster passt, $matches[1] den Text, der auf das erste eingeklammerte Teilsuchmuster passt und so weiter."
    http://de.php.net/manual/de/function.preg-match.php

    ... oder denke nach.
    Wie bist Du an "http://www.test.de?" gekommen, wenn nicht durch einen Zugrif auf ein Array-Element? Wenn das in einem Array und nicht in einer Variable steht, was glaubst Du, warum das so ist? Möglicherweise, weil mehr als nur ein Wert "zurückgegeben" wird? Dann verwende doch var_dump() um Dir das array anzuschauen.