2013-08-07 5 views
-1

Je ne parviens pas à récupérer un paramètre d'URL à partir d'une chaîne en utilisant des expressions régulières:Parse expression régulière paramètre url

Une chaîne exemple pourrait être

some text and http://google.com/?something=this&tag=yahoo.com and more text, et je voudrais être en mesure de trouver yahoo.com de ce.

La mise en garde est que je dois faire en sorte que la chaîne commence par http://google.com, et non seulement pour rechercher &tag=(.*)

preg_match("/google\.com\/.*&tag=(.*) $/", $subject, $matches)

J'espère que cela correspond à quoi que ce soit avec google.com suivi par quoi que ce soit, suivi par &tag= suivi d'un espace. En fin de compte, l'objectif est d'analyser toutes les valeurs tag= de google.com URL.

Existe-t-il un meilleur moyen d'y parvenir?

Mise à jour:

J'ai donc cette nouvelle regex: /google\.com\/.*(tag=.*)/ mais je ne suis pas sûr de savoir comment l'obtenir à la fin sur un espace après l'URL

+0

Quel est le problème avec votre code? –

+0

Pourquoi l'espace à la fin de votre modèle? – lafor

+0

J'espère faire correspondre la fin de la chaîne avec un espace ... (je devrais probablement ajouter '$') –

Répondre

4

get amical avec la fonction parse_url()!

$pieces = parse_url('some text http://google.com/?something=this&tag=yahoo.com and whatever'); 
$query = explode('&', $pieces['query']); 

parse_str($pieces['query'], $get); 
array_walk($get, function(&$item){ 
    if (!$sp = strpos($item, ' ')) return; 
    $item = substr($item, 0, $sp); 
}); 

var_dump($get); // woo! 

edit: merci à Johnathan pour la fonction parse_str().

+0

merci, jamais utilisé cela - mais la chaîne dans cet exemple sera plus de texte que juste l'URL –

+2

Ne pas oublier [parse_str] (http://www.php.net/manual/en/function.parse-str. php) pour analyser la chaîne de requête. –

+1

@d -_- b, theres aucun problème que theres texte supplémentaire, 'parse_url' l'arrache. – castis

1

Si vous souhaitez obtenir la valeur de tag alors l'expression rationnelle suivante fera le travail:

$string = 'some text and http://google.com/?something=this&tag=yahoo.com 
and more text 
http://google.com/?something=this&tag=yahoo2.com&param=test 
'; 
preg_match_all('#http://google.com\S+&tag=([^\s&]+)#', $string, $m); 
print_r($m[1]); 

Sortie

Array 
(
    [0] => yahoo.com 
    [1] => yahoo2.com 
) 

Explication

  • http://google.com: match de http://google.com
  • \S+: match non des espaces une ou plusieurs fois
  • &tag=: match &tag=
  • ([^\s&]+): quoi que ce soit correspondent à l'exception des espaces et & une ou plusieurs fois et le groupe il

Si vous voulez , vous pouvez même ajouter s? après http pour prendre en compte https, ou ajouter le modificateur i pour qu'il corresponde à la casse.

+0

c'est génial! Merci! Je vais examiner cela dans un petit moment ... question rapide, pourquoi le '#' au début? –

+1

@d -_- b C'est le modificateur. J'ai utilisé '#' au lieu de '/' que vous utilisez. Pourquoi ? Parce que si j'utilise un modificateur différent de '/', je n'aurais pas besoin d'échapper ces barres obliques par exemple dans 'http: //' :) – HamZa

Questions connexes