如何用regex-php替换URL的多个参数



我有一个逻辑问题,因为我不太处理正则表达式。我想知道如何替换几个值​​从一个URL到另一个值。例如:

http://example.com/values?value1=12121&顺序=3&外部=AFB3432

我想要一个正则表达式来选择参数,并将其替换为我想要的:

http://example.com/values?value1=10000&顺序=3&外部=AAAAA

如果有什么比和雷格斯一起做更好的方法,那就太好了!

"params_": {
"value1": {
"paramName": "value1",
"paramValue": "12121"
},
"order": {
"paramName": "order",
"paramValue": "3",
},
"external": {
"paramName": "external",
"paramValue": "AFB3432"
},

那么,最初的URL是:

http://example.com/values?value1=12121&顺序=3&外部=AFB3432

但是,我需要更改"value1"one_answers"external"的值。参数永远不会改变:

http://example.com/values?value1=10000&顺序=3&外部=AAAAA

谢谢!

您可以使用内置的PHP URL解析(parse_urlparse_str(和查询构建(http_build_query(函数来实现此目的。我假设您可以将替换值放入一个数组:

$replacements = array('value1' => 10000, 'external' => 'AAAAA');
$url = 'http://example.com/values?value1=12121&order=3&external=AFB3432';
// extract the query part
$query = parse_url($url, PHP_URL_QUERY);
// and parse it into variables
parse_str($query, $params);
// merge the parameter values with the replacements
$new_params = array_merge($params, $replacements);
// create a new query string
$new_query = http_build_query($new_params);
// and reassemble the URL
$new_url = parse_url($url, PHP_URL_SCHEME) . "://" . parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH) . "?" . $new_query;
echo $new_url;

输出:

http://example.com/values?value1=10000&order=3&external=AAAAA

3v4l.org 上的演示

您还可以使用更基本的strpos和str_replace方法。

$link = "http://example.com/values?value1=12121&order=3&external=AFB3432*";
$find = ["value1=", "order=", "external="];
$repl = [10000, 3, "AAAAA"];
foreach($find as $key => $f){
$pos1 = strpos($link, $f);
$pos2 = strpos(substr($link, $pos1), "&");
// I substring $link above to make $pos2 a "lenght" instead of a position
if($pos2 !== false){ // if $pos2 is false then it's the last argument
$link = str_replace(substr($link, $pos1, $pos2), $f . $repl[$key], $link);
}else{
$link = str_replace(substr($link, $pos1), $f . $repl[$key], $link);
}
}
echo $link;

https://3v4l.org/1VZiq

您可以根据您提供的示例使用它,这将完成任务

(?<==).*?(?=&)|(?<==).*$
  • (?<==)-正面看后面。匹配CCD_ 5
  • .*?-匹配除新行之外的任何内容
  • (?=&)-与&匹配
  • |—与逻辑OR相同的转换
  • (?<==)-正面看后面。匹配CCD_ 11
  • .*$-匹配除换行符以外的任何内容直到字符串末尾

演示

最新更新