我有以下代码:
$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在其中的某些项目中“分布”。
提前致谢!
答案 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¶m_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进行过滤。