【问题标题】:Add values to a query string in a URL [duplicate]将值添加到 URL 中的查询字符串 [重复]
【发布时间】:2012-02-01 17:56:52
【问题描述】:

可能重复:
Change single variable value in querystring

我正在检索当前 URL:

http://example.com/?s=original&fq=category

现在我想为s=插入一个额外的参数

s=original+additional&fq=category

如果有人知道这一点,将不胜感激!

编辑:

这是在 PHP WordPress 环境中。我很想坚持使用 PHP Regex,因为我不确定如何使用 jQuery/js

【问题讨论】:

  • 对于什么编程语言?有很多解决方案,如果语言支持 URL 解析功能,有些甚至不需要正则表达式
  • 哎呀,这是一个php环境。查看我的编辑。

标签: php regex


【解决方案1】:

不明确要求正则表达式的解决方案:

$old   = 'http://example.com/?s=original&fq=category';
$parts = parse_url($old);

parse_str($parts['query'], $query);
$query['s'] .= ' additional';

$new = sprintf(
  '%s://%s%s?%s'
    , $parts['scheme']
    , $parts['host']
    , $parts['path']
    , http_build_query($query)
);

echo 'Old: ', $old, PHP_EOL, 'New: ', $new, PHP_EOL;

以上代码输出:

旧:http://example.com/?s=original&fq=category 新:http://example.com/?s=original+additional&fq=category

【讨论】:

  • 实际上,也许您可​​以对此有所了解(或者我可以将其移至新主题):在 &fq=category 之后,有一个冒号,实际类别用引号括起来(在 Mozilla ) 像这样, :"Yogurt" 。如果我复制并粘贴 URL,则输出为 :%22Yogurt%22 。现在,如果我使用您提供的解决方案,复制和粘贴的 URL 输出为 %3A\%22Yogurt\%22 。所以我在这里遇到了一些不一致的情况。我想我会把它移到一个新问题上。
  • 我想出了一个临时修复方法:$query['fq'] = stripslashes(urldecode($query['fq']));
  • 这很奇怪;我无法复制,虽然我想我找到了the new issue you created,所以我会看看。
【解决方案2】:

PHP 具有解析和重建 URL 的内置函数:

$bits = parse_url($url);
$args = parse_str($bits['query']);

$args['s'] .= 'morestuff';

$bits['query'] = http_build_query($args);
$new_url = http_build_url($bits);

【讨论】:

    【解决方案3】:
    preg_replace($s, '/([?&]s=)([^&]+)/', '$1$2+additional');
    

    快速 PowerShell 测试:

    PS> $urls = 'http://example.com/?s=original&fq=category', 'http://example.com/?a=original&s=foo&fq=category'
    PS> $urls -replace '([?&]s=)([^&]+)', '$1$2+additional'
    http://example.com/?s=original+additional&fq=category
    http://example.com/?a=original&s=foo+additional&fq=category
    

    【讨论】:

    • $1 指的是现有的搜索词?
    • $1 指的是与第一个括号匹配的任何内容。在这种情况下,这包括 ?&s=
    【解决方案4】:

    你可以这样 preg_replace:

    $url = 'http://example.com/?s=original&fq=category';
    $regex = '~([&?]s=)([^&]*)(&|$)~i';
    $url = preg_replace($regex, '$1$2+additional$3', $url);
    var_dump($url);
    

    输出:

    string(53) "http://example.com/?s=original+additional&fq=category"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多