J'utilise PHP pour construire l'URL de la page en cours. Parfois, les URL sous la forme de
www.mydomian.com/myurl.html?unwantedthngs
sont demandés. Je veux supprimer le ?
et tout ce qui le suit (chaîne de requête), de sorte que l'URL résultante devienne:
www.mydomain.com/myurl.html
Mon code actuel est le suivant:
<?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;
}
?>
Vous pouvez utiliser strtok
pour obtenir une chaîne avant la première occurrence de ?
$url=strtok($_SERVER["REQUEST_URI"],'?');
Utilisez PHP Manual - parse_url () pour obtenir les composants dont vous avez besoin.
Edit (exemple d'utilisation de @Navi Gamage)
Vous pouvez l'utiliser comme ceci:
<?php
function reconstruct_url($url){
$url_parts = parse_url($url);
$constructed_url = $url_parts['scheme'] . '://' . $url_parts['Host'] . $url_parts['path'];
return $constructed_url;
}
?>
Edit (deuxième exemple complet):
Fonction mise à jour pour s'assurer que le schéma sera attaché et qu'aucun message d'erreur ne s'affiche:
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));
}
Reviendra:
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
)
Il s'agit du résultat obtenu en transmettant des exemples d'URL à parse_url () sans deuxième paramètre (pour une explication uniquement).
Et ceci est la sortie finale après la construction de l'URL en utilisant:
foreach($test as $url){
echo reconstruct_url($url) . '<br/>';
}
Sortie:
http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html
meilleure solution:
echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
Pas besoin d'inclure votre http://domain.com dans votre si vous soumettez un formulaire au même domaine.
$val = substr( $url, 0, strrpos( $url, "?"));
moyen le plus simple
$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
Vous aurez besoin d'au moins PHP Version 5.4 pour implémenter cette solution sans exploser en une variable sur une ligne ni en concaténer sur la suivante, mais un liner simple serait:
$_SERVER["HTTP_Host"].explode('?', $_SERVER["REQUEST_URI"], 2)[0];
Variables du serveur: http://php.net/manual/en/reserved.variables.server.php
Array Dereferencing: https://wiki.php.net/rfc/functionarraydereferencing
Si vous voulez obtenir le chemin de la requête ( plus d'infos ):
echo parse_url($_SERVER["REQUEST_URI"])['path']
Si vous souhaitez supprimer la requête et (et peut-être fragmenter également):
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);
Tu peux essayer:
<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>
Pour supprimer la chaîne de requête de l'URI de la demande, remplacez la chaîne de requête par une chaîne vide:
function request_uri_without_query() {
$result = $_SERVER['REQUEST_URI'];
$query = $_SERVER['QUERY_STRING'];
if(!empty($query)) {
$result = str_replace('?' . $query, '', $result);
}
return $result;
}
Étant donné que je traite à la fois des URL relatives et absolues, j'ai mis à jour la solution de veritas, à l'instar du code ci-dessous.
Vous pouvez vous essayer ici: 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;
}
pourrait également utiliser ce qui suit selon le commentaire du manuel php
$_SERVER['REDIRECT_URL']
Veuillez noter que cela ne fonctionne que pour certains PHP environnements et suivez le commentaire ci-dessous à partir de cette page pour plus d'informations;
Objectif: Le nom de chemin de l'URL du fichier PHP actuel, info-chemin est N/A et exclut la chaîne de requête d'URL. Inclut la barre oblique.
Mise en garde: Ceci est avant les réécritures d’URL (c’est-à-dire selon l’URL d’appel d’origine).
Mise en garde: Pas défini sur tous les environnements PHP, et uniquement sur ceux avec des réécritures d'URL.
Fonctionne en mode web: oui
Fonctionne en mode CLI: Non
Essaye ça
$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);
Vous pouvez utiliser la fonction de construction parse_url comme ceci:
$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);