2010-08-12 6 views
2

si j'ai un lien qui lit http://localhost/link/index.php?s=30&p=3 comment pourrais-je dépouiller ?s=30&p=3 donc mon lien lit Est-il possible que je peux dépouiller les variables d'un lien en utilisant PHP par exemple, http://localhost/link/index.phpurl PHP question

Répondre

10
list($url) = explode("?", $longUrl, 2); 
+0

Cela semble être la mère de toutes les solutions à ces questions. Une ligne, pas trop lente et fonctionne même sans un point d'interrogation présent. Agréable. – scy

2

Essayez ceci:

$pos = strpos($url, '?'); 
if($pos !== FALSE) { 
    $url = substr($url, 0, $pos); 
} 
+0

Ne considère pas le cas où '?' ne constitue pas un ppear. "Si length est donné et vaut 0, ** FALSE ** ou NULL, une chaîne vide sera renvoyée [from substr)." – Artefacto

+0

@Artefacto, maintenant il le fait :) –

0
$url = 'http://localhost/link/index.php?s=30&p=3'; 
$d = explode("?", $url); 
$stripped = reset($d); 
+0

Trois lignes au lieu d'une, et probablement un peu plus lent que la suggestion de Jacob. – scy

+0

Est-ce que exploser délimite automatiquement '?' ? En fait, vous semblez simplement utiliser la réinitialisation. oh, je vois - je pense que cela devrait lire $ stripped = reset ($ d); –

+0

@scy La solution de Jacob ne fonctionne pas quand il n'y a pas de chaîne de requête et ces "3 lignes" sont en fait deux (une est une définition d'entrée) et pourraient facilement être 1 avec le déréférencement du réseau. – Artefacto

0

Je n'ai pas testé, mais vous pourriez probablement faire quelque chose comme:

$my_url = 'http://localhost/link/index.php?s=30&p=3'; 
$split = explode('?', $my_url); 
$new_url = $split[0]; 
+1

Depuis quand peux-tu omettre le '$' dans php :)? – svens

+0

heh. oh ouais, oups. N'écris plus beaucoup de php. J'ai mis à jour afin de ne pas causer de confusion. Merci. –

0
$fullUrl = "http://localhost/link/index.php?s=30&p=3#dontreplace"; 
$urlData = parse_url($fullUrl); 
$url = str_replace('?'.$urlData['query'],'',$fullUrl); 

Cette solution prend en compte le fait que vous pourriez avoir un hashtag après les paremètres et ne le remplace pas.

Si vous ne vous souciez pas de ce qui est après? puis utilisez les autres réponses

6

Modifier (suggested by Hoohah):

Vous pouvez également utiliser strstr() (à partir de PHP 5.3.0):

echo strstr($longurl, "?", TRUE); 

PHP a construit en fonction de cette .

Il est parse_url(). Jetez un oeil aux valeurs de retour possibles. Dans ce cas, nous pouvons utiliser scheme, host et path.

Par exemple:

<?php 
$info = parse_url("http://localhost/link/index.php?s=30&p=3"); 
echo $info["scheme"] . "://" . $info["host"] . $info["path"]; 
    // Output: http://localhost/link/index.php 
?> 

Live example


L'avantage de cette méthode par rapport à l'utilisation explode() est qu'il vous permet de décider si vous voulez afficher le nom d'utilisateur, mot de passe et port si inclus. Le code ci-dessus ne montrera aucun de ceux-ci, ainsi http://user:[email protected]:81/link/index.php?s=30&p=3 renverra http://localhost/link/index.php, dépouillant le nom d'utilisateur, le mot de passe, et le numéro de port, qui est ce que je suppose que vous voudriez. Le nom d'utilisateur, le mot de passe et le port sont disponibles en tant que $info["user"], $info["pass"] et $info["port"].

La méthode explode() échoue si le mot de passe contient des points d'interrogation. This method doesn't fail even with ? and @ signs in the password.


Comme note finale, si vous allez traiter avec les numéros de port, les noms d'utilisateur et mots de passe, vous pouvez utiliser le code ci-dessous (qui a une ligne ajoutée) pour dépouiller les noms d'utilisateur et mots de passe, mais gardez le numéro de port :

<?php  
$info = parse_url("http://user:__?**@@@@&[email protected]:80/link/index.php?s=30&p=3"); 
    // If port is present add a colon before it, if not make it an empty string. 
isset($info["port"]) ? $port = ":" . $info["port"] : $port =""; 
echo $info["scheme"] . "://" . $info["host"] . $port . $info["path"]; 
    // Outputs: http://localhost:80/link/index.php 
?> 

Live example


Enfin, vous devriez vraiment pas en utilisant le nom d'utilisateur et mot de passe dans le lien.De RFC2396

Certains schémas d'URL utilisent le format suivant: dans le champ userinfo "mot de passe utilisateur". Cette pratique n'est pas recommandée, car le passage de informations d'authentification en texte clair (comme URI) s'est avéré être un risque de sécurité dans presque tous les cas où il a été utilisé.

+0

Ouch. Hurts que vous deviez écrire la première phrase en gras. Un peu embarrassant que nous ayons oublié parse_url() existe. C'est de loin la solution la plus propre, oui. – scy

+0

[Exemple d'échec] (http://codepad.viper-7.com/tkmI8E). 'parse_url' n'est pas très adéquat pour ça. – Artefacto

+0

@Artefact - Ce n'est pas un échec; c'est une victoire. Est-ce que ** vous ** voulez vraiment le 'nom d'utilisateur' et **' mot de passe' ** inclus dans HTML servi ???? C'est exactement pourquoi 'parse_url' est génial. BTW si vous voulez, vous pouvez ** inclure ceux qui sont présents .... juste jeter un oeil sur les valeurs de retour possibles. –

0
parse_url('http://localhost/link/index.php?s=30&p=3',PHP_URL_PATH); 
+0

Cela ne fonctionne pas (PARSE_URL_PATH n'est même pas une constante, et si PHP_URL_PATH était utilisé, il ne donnerait que la partie du chemin), mais d'une façon ou d'une autre il a été upvoted deux fois. – Artefacto

0
$url = strtok($url,"?"); 
0

Si U ont besoin pour analyser l'URL demandée, U peut simplement prendre de GLOBALS: Composant

// http://localhost/foo/bar?foo=bar&Foo1=Bar1 
var_dump($_SERVER['QUERY_STRING']); // string(17) "foo=bar&Foo1=Bar1" 

Si Fondation http symfony/est utilisé, U peut obtenir requête string de sa classe Request comme suit:

$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals(); 
$queryString = $request->getQueryString();