Aktueller Standort: Startseite> Neueste Artikel> Parse_url wie man damit umgeht, wenn sie in der URL auf mehrere Fragenmarkierungen stoßen?

Parse_url wie man damit umgeht, wenn sie in der URL auf mehrere Fragenmarkierungen stoßen?

gitbox 2025-05-26

Bei Verwendung von PHP zur Verarbeitung von URLs ist Parse_url eine sehr häufige Funktion. Es kann eine URL in verschiedene Teile zersetzen, wie z. B. Protokoll (Schema), Host (Host), Pfad (Pfad), Abfrageparameter (Abfrage) usw. In der tatsächlichen Entwicklung können wir jedoch auf eine spezielle Situation stoßen: Mehr als ein Fragezeichen ( ? ) Erscheint in der URL. Kann Parse_url zu diesem Zeitpunkt immer noch normal funktionieren? In diesem Artikel wird eine detaillierte Analyse dieses Problems durchgeführt.

1. grundlegende Verwendung von Parse_url

Die grundlegende Syntax von Parse_url ist wie folgt:

 $url = "https://gitbox.net/path/to/page?name=foo&age=20";
$parsed = parse_url($url);
print_r($parsed);

Das Ausgabeergebnis ist wie folgt:

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /path/to/page
    [query] => name=foo&age=20
)

Aus diesem Beispiel können wir sehen, dass Parse_url verschiedene Komponenten der URL genau analysieren kann. Was ist, wenn es mehrere Fragen in der URL gibt?

2. Was passiert, wenn die URL mehrere Fragenmarkierungen enthält?

In der Standard -URL -Spezifikation kann in einer URL nur ein Fragezeichen verwendet werden, um Pfade und Abfragen von Zeichenfolgen zu trennen. Zum Beispiel:

 https://gitbox.net/page?first=1&second=2

Aber in Wirklichkeit ist es nicht immer so "Regeln". Manchmal stoßen wir auf einige "nicht standardmäßige" URLs wie:

 https://gitbox.net/page??id=123?name=jack

Schauen wir uns an, wie Parse_url diese Art von URL analysieren wird:

 $url = "https://gitbox.net/page??id=123?name=jack";
$parsed = parse_url($url);
print_r($parsed);

Ausgangsergebnis:

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /page
    [query] => ?id=123?name=jack
)

Wie Sie sehen können, wirft Parse_url bei der Begegnung mehrerer Fragemarken keinen Fehler auf, sondern verwendet das erste Fragezeichen als Trennungspunkt zwischen "Pfad" und "Abfrageparametern", und alle nachfolgenden Inhalte werden als Teil der Abfragebarstellung angesehen. Mit anderen Worten, es erkennt nur das erste Fragezeichen, und nachfolgende Fragen werden als gewöhnliche Zeichen angesehen und im Abfrageteil beibehalten.

3. Was bedeutet es für Entwickler?

Dies bedeutet, dass Sie, wenn Sie Parse_url verwenden, um URL -Eingaben von Benutzern oder Dritten zu verarbeiten, und diese URL -Strukturen sind nicht Standard (einschließlich mehrerer Fragemarken), Sie müssen besonders vorsichtig sein. Obwohl Parse_url keinen Fehler meldet, entspricht die Ausgabe möglicherweise nicht Ihren Erwartungen.

Zum Beispiel:

 $url = "https://gitbox.net/path??sort=asc?filter=active";
$parsed = parse_url($url);
echo $parsed['query']; // Ausgabe: ?sort=asc?filter=active

Wenn Sie als nächstes Parse_str an der Analyse von Abfragen analysieren, werden Sie feststellen, dass es möglicherweise nicht die gewünschten Schlüsselwertpaare analysiert.

4. Bewältigungsstrategien

Wenn Sie erwarten, mit unregelmäßigen URLs umzugehen, können Sie die folgenden Möglichkeiten berücksichtigen:

  1. Vorverarbeitungs -URL : "Reinigen" die URL im Voraus mit regulären Ausdrücken oder Stringoperationen und verarbeiten oder ersetzen Sie die unnötigen Fragenmarkierungen.

     $url = preg_replace('/\?{2,}/', '?', $url);
    
  2. Refactor the Query -Teil manuell neu aufstellen : Verwenden Sie Strpos , um das erste Fragezeichen zu finden, trennen Sie den Pfad und die Abfragezeichenfolge manuell und passen Sie dann die Verarbeitung an.

  3. Verlassen Sie sich nicht auf Parse_url, um Abfrageparameter zu erhalten : Wenn Sie sich nur um den Inhalt des Abfrageteils kümmern, können Sie das Teil direkt aus der URL extrahieren ? und verwenden Sie dann Parse_str .

     $queryPart = substr($url, strpos($url, '?') + 1);
    parse_str($queryPart, $params);
    

V. Schlussfolgerung

Parse_url ist ein leistungsstarkes Werkzeug, aber es ist nicht allmächtig. Vor allem, wenn sie einigen "nicht standardmäßigen" URLs konfrontiert sind, wie z. B. diejenigen, die mehrere Fragen enthalten, muss ihr Verhalten von den Entwicklern klar verstanden werden. Der Schlüssel ist: Parse_url erkennt nur das erste Fragezeichen, und der Rest wird in Abfrage eingeteilt, und mehrere Abfragesegmente werden nicht automatisch identifiziert. Wenn die Datenquelle nicht kontrolliert wird, müssen wir die URL vorbereiten, um logische Fehler zu vermeiden, die durch Fehlinterpretation verursacht werden.