2009-05-03 12 views
3

Ainsi, la situation dans laquelle je suis actuellement en est un petit peu compliqué (pour moi qui est), mais je vais faire un essai.Comment ajouter des variables à une URL qui contient déjà des variables?

Je voudrais courir un extrait de code HTML et extraire tous les liens renvoyant à mon propre domaine. Ensuite, je veux ajouter ces URL avec une chaîne prédéfinie de variables GET. Par exemple, je veux ajouter? Var1 = 2 & var2 = 4 ' 'http://www.domain.com/page/' créant ainsi 'http://www.domain.com/page/?var1=2&var2=4'.

La méthode que je suis actuellement l'application est une fonction simple preg_replace (PHP), mais voici quand il devient intéressant. Comment puis-je créer des URL ajoutées valides quand elles ont déjà des vars GET à la fin? Par exemple, il pourrait créer une URL comme ceci: « http://www.domain.com/page/?already=here&another=one?var1=2&var2=4 » brisant ainsi les données GET.

Pour conclure, ce que je cherche est un reg exp qui peut faire face à ces scénarios, créer mon URL étendue et écrire retour à l'extrait de HTML.

C'est ce que j'ai jusqu'à présent:

$sHTML = preg_replace("'href=\"($domainURL.*?[\/$])\"'", 'href="\1' . $appendedTags . '"', $sHTML); 

Merci à l'avance

+0

Si je comprends correctement, vous devriez probablement encoder la deuxième chaîne de requête avec Base64, puis dans votre PHP lorsque vous lisez, décoder. – BobbyShaftoe

Répondre

4

En plus de ce Elazar Leibovich suggéré, je parse la chaîne de requête avec parse_str(), modifier le tableau résultant à mes besoins, puis utiliser http_build_query() pour reconstruire la chaîne de requête. De cette façon, vous n'aurez pas de doublons dans votre chaîne de requête et vous n'aurez pas à vous embêter avec l'encodage url de vos parties de requêtes.

L'exemple complet ressemblerait alors à (augmenter le code Elazar Leibovich):

$broken = parse_url($url); 
$query = parse_str($broken['query']); 
$query['var1'] = 1; 
$query['var2'] = 2; 
$broken['query'] = http_build_query($query); 
return $broken['scheme'] . '://' . $broken['host'] . $broken['path'] . 
    '?' . $broken['query'] . '#' . $broken['fragment']; 
+0

Je n'ai jamais su que ces fonctions existaient même, merci à tous. J'aimerais pouvoir accepter les deux réponses, mais j'ai choisi la vôtre pour la plupart des réponses et la réponse complète. – SolidSmile

+0

Pour être honnête: personne ne penserait que parse_str() fera ce qu'il fait en regardant le nom de la fonction ;-) –

3

Regex ne sont pas la solution, comme quelqu'un said:

Certaines personnes, lorsqu'ils sont confrontés à un problème, pensez "Je sais, je vais utiliser expressions régulières." Maintenant, ils ont deux problèmes.

Mais que tant pis, ce que j'utiliser, est parse_url, puis ajoutez mon var1=1&var2=2 à la chaîne de requête de résultat. Quelque chose le long des lignes de:

$broken = parse_url($url); 
$broken['query'] .= '&var1=1&var2=2'; 
if (strpos($broken,'&')==0) $broken['query'] = substr($broken['query'],1); 
return $broken['scheme'].'://'.$broken['host'].$broken['path']. 
    '?'.$broken['query'].'#'.$broken['fragment']; 

Si vous ne voulez pas que votre variable apparaisse deux fois, utilisez également parse_str pour briser la chaîne de requête.

+1

parse_url() est certainement la bonne façon de procéder. +1 pour ça.Cependant, si parse_url n'était pas disponible, regexp est un second choix naturel, et je pense qu'il est raisonnable de s'attendre à ce que quelqu'un qui ne connaît pas parse_url() essaie de trouver une solution d'expression rationnelle. C'est juste un de ces problèmes auxquels regexp est adapté. En fait, je serais surpris si la propre implémentation de PHP de parse_url() n'utilisait pas les regexps sous le capot. – Calvin

+0

@Calvin; Soyez surpris http://alanstorm.com/testbed/parse_url.txt –

+0

Peut-être donné php, la solution la plus rapide est regex, mais il * doit * être encapsulé par une fonction. Avec C++, c'est nettement moins efficace et pas bon pour l'analyse générale des URL. Nous utiliserons parse_url si elle est donnée ou non, si elle n'est pas donnée - nous l'implémenterons. Nous pourrions choisir de l'implémenter avec une regex, mais ceci est le détail de l'implémentation et non la cause principale. –

0

De plus, le parse_str retour wont des valeurs comme indiqué dans la réponse plutôt qu'il faut un tableau comme param:

$array = array();  
parse_str($url,$array); 
// $array will contain the ["scheme"] ["host"] etc 

juste une note de côté;)

- G

Questions connexes