Wie entferne ich den Querystring und erhalte nur die URL?

201

Ich benutze PHP, um die URL der aktuellen Seite zu erstellen. Manchmal URLs in Form von

www.mydomian.com/myurl.html?unwantedthngs

sind angefordert. Ich möchte das ?und alles, was darauf folgt (Querystring) entfernen, so dass die resultierende URL wird:

www.mydomain.com/myurl.html

Mein aktueller Code lautet:

<?php
function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" .
            $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
?>
Navi Gamage
quelle
8
Übrigens, das nennt man die "Abfragezeichenfolge".
Evan Mulawski

Antworten:

577

Sie können verwenden strtok, um Zeichenfolge vor dem ersten Auftreten von abzurufen?

$url = strtok($_SERVER["REQUEST_URI"], '?');

strtok()stellt die prägnanteste Technik dar, um den Teilstring direkt vor dem ?im Querystring zu extrahieren. explode()ist weniger direkt, da es ein Array mit möglicherweise zwei Elementen erzeugen muss, über das auf das erste Element zugegriffen werden muss.

Einige andere Techniken können brechen, wenn der Querystring fehlt, oder möglicherweise andere / unbeabsichtigte Teilzeichenfolgen in der URL mutieren - diese Techniken sollten vermieden werden.

Eine Demonstration :

$urls = [
    'www.example.com/myurl.html?unwantedthngs#hastag',
    'www.example.com/myurl.html'
];

foreach ($urls as $url) {
    var_export(['strtok: ', strtok($url, '?')]);
    echo "\n";
    var_export(['strstr/true: ', strstr($url, '?', true)]); // not reliable
    echo "\n";
    var_export(['explode/2: ', explode('?', $url, 2)[0]]);  // limit allows func to stop searching after first encounter
    echo "\n";
    var_export(['substr/strrpos: ', substr($url, 0, strrpos( $url, "?"))]);  // not reliable; still not with strpos()
    echo "\n---\n";
}

Ausgabe:

array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => 'www.example.com/myurl.html',
)
---
array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => false,                       // bad news
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => '',                          // bad news
)
---
RiaD
quelle
24
+1 für die direkte Verwendung von $ _SERVER, anstatt die URL neu zu erstellen, nur um sie erneut zu analysieren. würde zur Verdeutlichung eine weitere +1 geben, wenn möglich.
Ericsoco
8
Hoppla - kehren Sie diese Argumente für explode () um, das Trennzeichen steht an erster Stelle. array_shift(explode('?',$_SERVER["REQUEST_URI"]))
hier
13
Es gibt nicht bool (false) zurück, wenn? ist in der Zeichenfolge nicht vorhanden, gibt die Zeichenfolge zurück.
Ben C
4
Großartig! .. Es wird immer noch die URL zurückgegeben, auch wenn sie ?nicht vorhanden ist.
Harikrishnan
1
@sepehr, ich sehe einfach keinen Grund, keine Funktion zu verwenden, die genau das tut, was Sie brauchen, und eine andere zu verwenden und das Ergebnis zu analysieren (dh nach dem Explodieren [0] zu erhalten) (es sei denn, es gibt natürlich einen bestimmten Grund wie eine bessere Leistung , Mangel an unnötiger Abhängigkeit usw.).
RiaD
66

Verwenden Sie das PHP-Handbuch - parse_url () , um die benötigten Teile zu erhalten.

Bearbeiten (Beispiel für die Verwendung von @Navi Gamage)

Sie können es so verwenden:

<?php
function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];

    return $constructed_url;
}

?>

Bearbeiten (zweites vollständiges Beispiel):

Die Funktion wurde aktualisiert, um sicherzustellen, dass das Schema angehängt wird und keine Benachrichtigungsnachrichten angezeigt werden:

function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . (isset($url_parts['path'])?$url_parts['path']:'');

    return $constructed_url;
}


$test = array(
    'http://www.mydomian.com/myurl.html?unwan=abc',
    'http://www.mydomian.com/myurl.html',
    'http://www.mydomian.com',
    'https://mydomian.com/myurl.html?unwan=abc&ab=1'
);

foreach($test as $url){
    print_r(parse_url($url));
}       

Wird zurückkehren:

Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
    [query] => unwan=abc
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
)
Array
(
    [path] => mydomian.com/myurl.html
    [query] => unwan=abc&ab=1
)

Dies ist die Ausgabe der Übergabe von Beispiel-URLs durch parse_url () ohne zweiten Parameter (nur zur Erläuterung).

Und dies ist die endgültige Ausgabe nach dem Erstellen der URL mit:

foreach($test as $url){
    echo reconstruct_url($url) . '<br/>';
}   

Ausgabe:

http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html
veritas
quelle
Ich habe es gelesen. Ich bin ein bisschen verwirrt, weil ich neu bei PHP bin. Kannst du mir mit dem obigen PHP-Code helfen?
Navi Gamage
Ich habe diesen Code nach der Zeile 9 hinzugefügt. $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?"));
Navi Gamage
Der Abfragebereich in der URL ...> www.mydomain.com/myurl.html?unwantedthings Ergebnis ist in Ordnung! > www.mydomian.com/myurl.html Fertig ... Aber wenn es mit normaler URL kommt> www.mydomain.com/myurl.html Ergebnis ist nichts .. Leer
Navi Gamage
strrpos () in 'www.mydomain.com/myurl.html' gibt 0 zurück (FALSE wird zur besseren Richtigkeit in Boolesche Werte umgewandelt ), sodass Ihr Substr leer ist. Verwenden Sie eins : substr () ODER parse_url (), da die Verwendung von beiden keinen Sinn macht;)
veritas
Ich meinte FALSE Casted to Int; D
Veritas
54

beste Lösung:

echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

Sie müssen Ihr http://domain.com nicht in Ihr Verzeichnis aufnehmen, wenn Sie ein Formular an dieselbe Domain senden.

Ludo - Inoffiziell
quelle
Beachten Sie, dass parse_url eine absolute URL erwartet, sodass Sie in einigen Fällen falsche Ergebnisse erhalten, z. B. wenn Ihre REQUEST_URL mit mehreren aufeinander folgenden Schrägstrichen beginnt. Diese werden als protokollbezogene URI interpretiert.
NikiC
16
$val = substr( $url, 0, strrpos( $url, "?"));
zellio
quelle
Jungs nach Ihren Antworten Ich bin fertig ... danke für Ihre Hilfe ... Es klagt Abfrage Abschnitt in der URL ...
Navi Gamage
> www.mydomain.com/myurl.html?unwantedthings Ergebnis ist Okay! > www.mydomian.com/myurl.html Fertig ... Aber wenn es mit normaler URL kommt> www.mydomain.com/myurl.html Ergebnis ist nichts .. Leer
Navi Gamage
Neuer PHP-Code code <? PHP-Funktion curPageURL () {$ pageURL = 'http'; if ($ _SERVER ["HTTPS"] == "on") {$ pageURL. = "s";} $ pageURL. = ": //"; if ($ _SERVER ["SERVER_PORT"]! = "80") {$ pageURL. = $ _SERVER ["SERVER_NAME"]. ":". $ _ SERVER ["SERVER_PORT"]. $ _ SERVER ["REQUEST_URI"]; } else {$ pageURL. = $ _SERVER ["SERVER_NAME"]. $ _ SERVER ["REQUEST_URI"]; $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?")); } return $ pageURL; }?>code
Navi Gamage
2
Ich denke, dies ist eine ziemlich süße und einfache Lösung für das Problem. Keine Notwendigkeit für viele Erweiterungen oder Funktionen. Ich habe dies verwendet, um den aktuell aufgerufenen Dateinamen zu erhalten. $ base = basename ($ _ SERVER ['REQUEST_URI']); $ page = substr ($ base, 0, strrpos ($ base, "?"));
Rob
Wie von Navi angegeben, ist diese Antwort nicht zuverlässig. 3v4l.org/nhVii Wenn der Querystring in der URL fehlt, wird die gesamte URL entfernt! Diese Technik ist nicht URL-Komponenten-fähig. Diese Antwort ist nicht ratsam.
Mickmackusa
9

Einfachster Weg

$url = 'https://www.youtube.com/embed/ROipDjNYK4k?rel=0&autoplay=1';
$url_arr = parse_url($url);
$query = $url_arr['query'];
print $url = str_replace(array($query,'?'), '', $url);

//output
https://www.youtube.com/embed/ROipDjNYK4k
Mukesh Saxena
quelle
Ich bin nicht der Meinung, dass dies der einfachste Weg ist. Nein, fetter Text macht Ihre Aussage nicht überzeugender. Dieser Antwort fehlt eine Erklärung.
Mickmackusa
@mickmackusa Könnten Sie bitte Ihren Kommentar ausarbeiten? Wo muss ich meine Antwort erklären? Ich werde dir dankbar sein.
Mukesh Saxena
Alle Antworten auf Stackoverflow sollten eine Erklärung enthalten, wie die Lösung funktioniert und warum Sie sie für eine ideale Technik halten. Links zur Dokumentation sind ebenfalls willkommen. Ich verstehe Ihre Lösung voll und ganz, andere Forscher jedoch möglicherweise nicht. Nur-Code-Antworten sind für Stackoverflow von geringem Wert, da sie nur sehr wenig dazu beitragen, Tausende zukünftiger Forscher auszubilden / zu befähigen. Nicht einfach zu sein - 3v4l.org/RE0GD wäre eine einfachere Version Ihrer Antwort, da es weniger deklarierte Variablen enthält und nur einen Ersatz anstelle von zwei macht. Die akzeptierte Antwort ist am einfachsten.
Mickmackusa
Ein weiterer Unterschied besteht darin, dass sich die akzeptierte Antwort auch um ein mögliches Fragment kümmert, Ihre jedoch nicht. 3v4l.org/ERr4V oder schlimmer noch, es könnte die URL links vom Querystring beschädigen. 3v4l.org/L61q1
mickmackusa
4

Sie können die eingebaute Funktion parse_url folgendermaßen verwenden:

$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
Mohammad altenji
quelle
2

Du kannst es versuchen:

<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>
ysrb
quelle
2

Wenn Sie einen Anforderungspfad erhalten möchten ( weitere Informationen ):

echo parse_url($_SERVER["REQUEST_URI"])['path']

Wenn Sie die Abfrage entfernen möchten und (und möglicherweise auch fragmentieren):

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}
$i = strposa($_SERVER["REQUEST_URI"], ['#', '?']);
echo strrpos($_SERVER["REQUEST_URI"], 0, $i);
user1079877
quelle
1

Ersetzen Sie die Abfragezeichenfolge durch eine leere Zeichenfolge, um die Abfragezeichenfolge aus dem Anforderungs-URI zu entfernen:

function request_uri_without_query() {
    $result = $_SERVER['REQUEST_URI'];
    $query = $_SERVER['QUERY_STRING'];
    if(!empty($query)) {
        $result = str_replace('?' . $query, '', $result);
    }
    return $result;
}
Ryan Prechel
quelle
Ich denke, es würde ein potenzielles Problem mit geben www.example.com/myurl.html?.
Earlee
1

Da ich sowohl mit relativen als auch mit absoluten URLs zu tun habe, habe ich die Lösung von veritas wie den folgenden Code aktualisiert.
Sie können es hier versuchen: https://ideone.com/PvpZ4J

function removeQueryStringFromUrl($url) {
    if (substr($url,0,4) == "http") {
        $urlPartsArray = parse_url($url);
        $outputUrl = $urlPartsArray['scheme'] . '://' . $urlPartsArray['host'] . ( isset($urlPartsArray['path']) ? $urlPartsArray['path'] : '' );
    } else {
        $URLexploded = explode("?", $url, 2);
        $outputUrl = $URLexploded[0];
    }
    return $outputUrl;
}
trante
quelle
1

könnte auch folgende gemäß dem PHP-Handbuch Kommentar verwenden

$_SERVER['REDIRECT_URL']

Bitte beachten Sie, dass dies nur für bestimmte PHP-Umgebungen funktioniert, und folgen Sie dem nachstehenden Kommentar auf dieser Seite, um weitere Informationen zu erhalten.

Zweck: Der URL-Pfadname der aktuellen PHP-Datei, Pfadinformationen sind N / A und ohne URL-Abfragezeichenfolge. Beinhaltet einen Schrägstrich.

Vorsichtsmaßnahme: Dies erfolgt vor dem erneuten Schreiben der URL (dh gemäß der ursprünglichen Anruf-URL).

Vorsichtsmaßnahme: Nicht in allen PHP-Umgebungen festgelegt und definitiv nur in Umgebungen mit URL-Umschreibungen.

Funktioniert im Webmodus: Ja

Funktioniert im CLI-Modus: Nein

Janith Chinthana
quelle
0

Versuche dies

$url_with_querystring = 'www.mydomian.com/myurl.html?unwantedthngs';
$url_data = parse_url($url_with_querystring);
$url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);
Kwelsan
quelle
0

Angenommen, Sie möchten die URL weiterhin ohne die Abfrageargumente abrufen (falls diese nicht festgelegt sind), verwenden Sie einfach eine kurze if-Anweisung, um Folgendes zu überprüfen strpos:

$request_uri = strpos( $_SERVER['REQUEST_URI'], '?' ) !== false ? strtok( $_SERVER["REQUEST_URI"], '?' ) : $_SERVER['REQUEST_URI'];
sMyles
quelle
0

Hier ist eine einfache Lösung, wenn Sie Laravel verwenden:

Str::before($request->getRequestUri(), '?')
ahinkle
quelle
-3

Versuche dies:

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']

oder

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']
HRALDA
quelle
1
Entschuldigung, aber das ist falsch - URI kann von htaccess umgeschrieben werden - dies würde dazu führen, dass der Skriptname zurückgegeben wird, nicht jedoch der aktuelle URI.
Hexodus
Gefährlich, da es gefälscht werden kann.
Tim
bestätigen ist falsch. Angenommen, Sie schreiben proxy.php, dh .htaccess leitet von Anforderungen für verschiedene Ressourcen wie index.php, price.php, about.php um und erstellt dynamisch eine Ansicht für den angeforderten Namen. Wenn Sie dies verwenden, sieht das Skript immer proxy.php und nicht die gewünschte angeforderte Ressource, die es erstellen möchte.
Dmitry