2009-05-03 9 views
3

Also, die Situation, in der ich mich gerade befinde, ist ein bisschen kompliziert (für mich), aber ich werde es versuchen.Wie hängt man Variablen an eine URL an, die bereits Variablen enthält?

Ich möchte zu einem HTML-Ausschnitt laufen und extrahiere alle Links, die sich auf meine eigene Domain beziehen. Als nächstes möchte ich diese URLs mit einer vordefinierten Zeichenfolge von GET Vars anhängen. Ich möchte zum Beispiel 'var1 = 2 & var2 = 4' an 'http://www.domain.com/page/' anhängen und so 'http://www.domain.com/page/?var1=2&var2=4' erstellen.

Die Methode, die ich derzeit anwende, ist eine einfache preg_replace-Funktion (PHP), aber hier wird es interessant. Wie erstelle ich gültige angehängte URLs, wenn sie am Ende bereits einige GET vars haben? Zum Beispiel könnte es eine URL wie folgt erstellen: 'http://www.domain.com/page/?already=here&another=one?var1=2&var2=4' bricht somit die GET-Daten.

Also zum Schluss, was ich suche ist eine reg exp, die mit diesen Szenarien umgehen kann, erstellen Sie meine erweiterte URL und schreiben Sie es zurück in das HTML-Snippet.

Das ist, was ich bisher habe:

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

Vielen Dank im Voraus

+0

Wenn ich verstehe, Sie sollten den zweiten Query-String wahrscheinlich mit Base64 codieren und dann in Ihrem PHP, wenn Sie davon lesen, ihn decodieren. – BobbyShaftoe

Antwort

4

Zusätzlich zu dem, was Elazar Leibovich vorgeschlagen, würde ich den Query-String mit parse_str(), ändern Sie das resultierende Array auf meine Bedürfnisse analysieren und dann http_build_query() verwenden, um den Abfrage-String neu zu erstellen. Auf diese Weise haben Sie keine Duplikate innerhalb Ihrer Abfragezeichenfolge und Sie müssen sich nicht mit der URL-Codierung Ihrer Abfrageteile beschäftigen.

Das komplette Beispiel würde dann folgendermaßen aussehen (Vermehrung Elazar Leibovich Code):

$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

Ich wusste nie, dass diese Funktionen überhaupt existierten, danke an alle. Ich wünschte, ich könnte beide Antworten akzeptieren, aber wählte für die meisten Upvotes und vollständige Antwort. – SolidSmile

+0

Um ehrlich zu sein: Niemand würde denken, dass parse_str() das tun wird, wenn er den Funktionsnamen anschaut ;-) –

3

Regex sind nicht die Lösung, wie jemand said:

Einige Leute, wenn sie mit einem konfrontiert Problem, denke "Ich weiß, ich werde regulären Ausdrücken verwenden." Jetzt haben sie zwei Probleme.

Aber macht nichts, dass das, was ich verwenden würde, ist parse_url, und dann meine var1=1&var2=2 dem Ergebnis Query-String anhängen. Etwas entlang der Linien von:

$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']; 

Wenn Sie nicht wollen, Ihre Variable zweimal erscheinen, verwenden auch parse_str die Abfragezeichenfolge auseinander zu brechen.

+1

parse_url() ist definitiv der richtige Weg, um darüber zu gehen. +1 dafür.Wenn parse_url jedoch nicht verfügbar ist, ist regexp eine natürliche zweite Wahl, und ich denke, es ist vernünftig zu erwarten, dass jemand, der parse_url() nicht kennt, versucht, eine regexp-Lösung zu finden. Dies ist nur eines der Probleme, für die regexp geeignet ist. In der Tat würde ich überrascht sein, wenn PHP eigene Implementierung von parse_url() Regexps unter der Haube nicht verwenden würde. – Calvin

+0

@ Calvin; Seien Sie überrascht http://alanstorm.com/testbed/parse_url.txt –

+0

Vielleicht gegeben php, ist die schnellste Lösung Regex, aber es muss * von einer Funktion eingekapselt werden. Mit C++ ist es definitiv viel weniger effizient und nicht gut für das allgemeine Parsen von URLs. Wir werden parse_url verwenden, ob es gegeben ist oder nicht, wenn es nicht gegeben ist - wir werden es implementieren. Wir könnten uns dafür entscheiden, es mit einer Regex zu implementieren, aber das ist Implementierungsdetail und nicht die Hauptursache. –

0

Auch die parse_str gewohnt alle Werte zurück, wie in der Antwort gezeigt sondern es nimmt ein Array als param:

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

nur eine Randnotiz;)

- G

Verwandte Themen