【问题标题】:How to append variables to a url which already has variables?如何将变量附加到已经有变量的 url?
【发布时间】:2009-05-03 13:49:51
【问题描述】:

所以,我目前的情况有点复杂(对我来说就是这样),但我会试一试。

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

我目前正在应用的方法是一个简单的 preg_replace 函数 (PHP),但这是它变得有趣的时候。当它们末尾已经有一些 GET 变量时,我如何创建有效的附加 url?例如,它可以创建一个这样的 url:'http://www.domain.com/page/?already=here&another=one?var1=2&var2=4' 从而破坏了 GET 数据。

总而言之,我正在寻找的是一个 reg exp,它可以应对这些场景,创建我的扩展 url 并将其写回 HTML sn-p。

这是我目前所拥有的:

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

提前致谢

【问题讨论】:

  • 如果我理解正确,您可能应该使用 Base64 对第二个查询字符串进行编码,然后在您的 PHP 中读取该字符串时对其进行解码。

标签: php regex url


【解决方案1】:

除了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'];

【讨论】:

  • 从来不知道这些功能甚至存在,谢谢大家。希望我能接受这两个答案,但选择您的答案以获得最多的支持和完整的答案。
  • 说实话:没有人会认为 parse_str() 在查看函数名时会做它所做的事情 ;-)
【解决方案2】:

正则表达式不是解决方案,就像某人 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 来拆分查询字符串。

【讨论】:

  • parse_url() 绝对是解决这个问题的正确方法。为此+1。但是,如果 parse_url 不可用,则 regexp 是自然的第二选择,我认为期望不知道 parse_url() 的人尝试找到 regexp 解决方案是合理的。这只是 regexp 适合解决的问题之一。事实上,如果 PHP 自己的 parse_url() 实现没有在后台使用正则表达式,我会感到惊讶。
  • 也许给定php,最快的解决方案是正则表达式,但它必须被一个函数封装。使用 C++,它的效率肯定要低得多,并且不适合 URL 的一般解析。我们将使用 parse_url 无论它是否给出,如果它没有给出 - 我们将实现它。我们可能会选择使用正则表达式来实现它,但这是实现细节而不是主要原因。
  • @Alam Storm:哈哈。我想是时候吃我自己的话了。 @Elazar:我同意。我只是认为将这个问题描述为正则表达式使用不当的例子是不公平的,即使从 Atwood 所来自的代码可读性的角度来看也是如此。
【解决方案3】:

parse_str 也不会返回任何值,如答案所示,而是将数组作为参数:

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

只是一个旁注;)

--G

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2023-03-25
    • 2011-11-09
    • 2021-10-11
    • 2018-06-27
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多