在PHP中捕获URL的某些参数

时间:2011-09-16 13:00:17

标签: php regex pattern-matching pcre

我有以下代码:

$url = 'http://www.domain.tld/go.jsp?a1=valuea1&b2=valueb2&c3=valuec3';
preg_match($regex, $url, $result);

我需要一个$ regex,应用于$ url,在$ result中返回相同的URL,但只返回正则表达式中选择的参数。例如,带有(替换|选择器)的正则表达式,用于必须检索的参数以及URL的其余部分。当然,参数的名称和值可以是标准有效的任何内容。的?和&在结果中使用可能不正确。例如,如果我想检索b2和c3参数,则这是有效的:

'http://www.domain.tld/go.jsp&b2=valueb2&c3=valuec3'

另外,我知道$ result是一个数组,我不介意URL在其中的某些项目中“分布”。

提前致谢!

2 个答案:

答案 0 :(得分:4)

使用parse_url获取URL的查询字符串部分;和parse_str来解析查询字符串:

$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);

var_dump($params);

您可以根据需要操作$ params,并使用http_build_query函数将其重新组合成查询字符串:

$query = http_build_query($params);

现在,使用正则表达式:

$url = preg_replace('/^
    ([^?#]+)            # everything except the query and #hash
    \?                  # the ?
    [^#]*?              # unwanted params
    \bparam_a=([^&#]+)  # param_a
    [^#]*?              # unwanted params
    \bparam_b=([^&#]+)  # param_b
    [^#]*?              # rest of query
    (\#.*)?             # optional #hash
    $/x', '\1?param_a=\2&param_b=\3\4', $url);

仅当param_a和param_b按此顺序出现时才有效;更喜欢parse_url / parse_str解决方案;)

答案 1 :(得分:0)

以下是一个简单的提议,要求单一参数进行过滤,以便您明白这一点:

'/(.+?) # capture everything before the filtering parameter
([&\?]?) # takes care of the initial parameter prefix
(c3=[^&$]*)&? # capture the c3 parameter to filter
(.*) # captures the rest/mx'

替换字符串是:

 '$1$2$4'

有一个小警告,如果它捕获最后一个参数,那么会有一个过早的&,但是你提到它在你提交的问题中不是问题。

<强>加成
为每个参数应用preg_match进行过滤。