2009-05-03 88 views
3

所以,我目前的情况有点复杂(对我来说),但我会试一试。如何将变量追加到已有变量的url?

我想运行一段HTML并提取所有指向我自己的域的链接。接下来,我想将这些URL添加一个预定义的GET变量字符串。例如,我想将'?var1 = 2 & var2 = 4'附加到'http://www.domain.com/page/',从而创建'http://www.domain.com/page/?var1=2&var2=4'。

我目前正在使用的方法是一个简单的preg_replace函数(PHP),但这里是它变得有趣的时候。当他们在最后有一些GET变量时,我如何创建有效的附加网址?例如,它可以创建一个像这样的网址:'http://www.domain.com/page/?already=here&another=one?var1=2&var2=4' 因此破坏了GET数据。

所以得出结论,我正在寻找的是一个reg exp,它可以处理这些场景,创建我的扩展url并将其写回到HTML代码片段。

这是我到目前为止有:提前

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

感谢

+0

如果我没有理解如果你正确的话,你应该用Base64对第二个查询字符串进行编码,然后在你读取它的时候在你的PHP中进行解码。 – BobbyShaftoe 2009-05-03 13:52:54

回答

4

除了建议的Elazar Leibovich之外,我会解析查询字符串parse_str(),根据需要修改生成的数组,然后使用http_build_query()来重建查询字符串。这样,您的查询字符串中就不会有任何重复内容,并且您不必为使用url编码查询部分而烦恼。

完整的例子将随后的样子(扩充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']; 
3

正则表达式是不是解决办法,因为有人said

有些人,当与 面临问题,认为“我知道,我会用 正则表达式。”现在他们有 两个问题。

不过没关系,我会用什么,是parse_url,然后追加我var1=1&var2=2到结果的查询字符串。沿着线的东西:

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

如果您不希望您的变量出现了两次,还用parse_str掰开查询字符串。

+1

parse_url()绝对是解决这个问题的正确方法。 +1。但是,如果parse_url不可用,则regexp是自然的第二选择,我认为期望不知道parse_url()的人试图找到正则表达式解决方案是合理的。这只是正则表达式适用的其中一个问题。事实上,如果PHP自己的parse_url()实现没有在引擎盖下使用regexps,我会感到惊讶。 – Calvin 2009-05-03 16:01:47

+0

@Calvin;惊讶http://alanstorm.com/testbed/parse_url.txt – 2009-05-03 16:59:43

0

另外,parse_str不会返回任何值如图所示的答案,而它需要一个数组作为PARAM:

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

只是一个侧面说明;)

- 摹