【问题标题】:String operation in PHPPHP中的字符串操作
【发布时间】:2009-09-29 04:31:43
【问题描述】:

我现在正在处理像 /page.html?k1=1&k2=2 这样的 uri

$str = preg_replace('/[&\?]' . $k . '=[^&]*/',"",$str);

上面的目的是删除uri中的$k相关部分,但也会删除?错了。

如何做正确的事?

【问题讨论】:

  • 我很困惑 - 请澄清您希望在应用正则表达式后生成的字符串是什么样的。

标签: php regex query-string


【解决方案1】:

试试这个:

preg_replace('/(?:(\?)|&)' . $k . '=[^&]*/', '$1', $str)

您应该在$k 上另外使用preg_quote

编辑    这是上面的扩展版本,应该可以解决 beggs 描述的问题:

/(?:(\?)|&)arg=[^&]*(?(1)(?:&|$))/

(?(1)(?:&|$)) epxression 是 conditional expression,如果第一个组找到匹配项,则使用它。因此,如果找到?,则删除该参数的尾随&

【讨论】:

    【解决方案2】:

    要删除查询字符串的一部分,我不会使用正则表达式,而是使用现有的用于操作 URL 的函数。

    例如,考虑这部分代码,它使用parse_url 函数来提取 URL 的一部分:

    $url = '/page.html?k1=1&k2=2';
    $parts = parse_url($url);
    var_dump($parts);
    

    你会得到:

    array
      'path' => string '/page.html' (length=10)
      'query' => string 'k1=1&k2=2' (length=9)
    

    您现在可以使用parse_str 提取原始查询字符串中包含的信息:

    $params = array();
    parse_str($parts['query'], $params);
    var_dump($params);
    

    这会得到你:

    array
      'k1' => string '1' (length=1)
      'k2' => string '2' (length=1)
    

    现在,要删除一个参数,您可以测试它是否存在于数组中,如果存在,则将其删除:

    $to_remove = 'k1';
    if (array_key_exists($to_remove, $params)) {
        unset($params[$to_remove]);
    }
    var_dump($params);
    

    现在给出以下参数数组:

    array
      'k2' => string '2' (length=1)
    

    最后,您可以使用http_build_query 将各个部分重新组合在一起:

    $new_query = http_build_query($params);
    var_dump($new_query);
    

    你会得到:

    string 'k2=2' (length=4)
    

    你现在只需要在你的 URL 之后注入这个 ;-)


    有些人可能会说它有点长......我会回答这个问题,看看这段代码,人们会立即理解它的目的——复杂的正则表达式并非如此。

    【讨论】:

      【解决方案3】:

      它正在删除“?”,因为您已将其包含在匹配项中并使用空替换。要删除匹配“$k”的变量并保留“?”,请使用 Gumbo 提供的代码,但请注意,当“$k”==“k1”时,结果字符串将为“/page.html?&k2=2” ",注意左边的"&"。

      【讨论】:

        【解决方案4】:

        如果您正在处理 URL 和查询字符串,您可能希望使用 parse_url 提取 URL 组件并使用 parse_str 提取查询字符串位。操作参数数组而不是处理正则表达式会容易得多。然后您可以使用http_build_query 将其重新组合在一起。

        【讨论】:

          猜你喜欢
          • 2012-07-16
          • 2015-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多