我有一个查询字符串,可能看起来像下列之一:
等
我想要做的只是替换值部分中的等号。所以它应该导致:
我正试图通过使用前面的正则表达式来实现这一点。但它没有做任何事情。
echo preg_replace("/=(?=[^&])=/", "%3d", 'http://www.example.com?key=aaa=bbb=ccc&key3=dddd');
我该如何做到这一点?
答案 0 :(得分:2)
(\bkey\d*)=(*SKIP)(*F)|=
试试这个。看看演示。
https://regex101.com/r/hR7tH4/13
$re = "/(\\bkey\\d*)=(*SKIP)(*F)|=/m";
$str = "\n ?key=aa=bb\n ?key=aa=bb=cc\n ?key=aa=bb&key2=cc\n";
$subst = "%3d";
$result = preg_replace($re, $subst, $str);
答案 1 :(得分:2)
您不需要正则表达式,请使用正确的工具。 parse_url()
获取查询字符串(以及您想要的任何其他内容),然后parse_str()
获取var / vals数组。然后http_build_query()
会为您编码:
$query = parse_url('http://www.example.com?key=aaa=bbb=ccc&key3=dddd', PHP_URL_QUERY);
parse_str($query, $array);
$result = http_build_query($array);
答案 2 :(得分:0)
以下是基于与vks'相同方法的正则表达式的另一个版本:
[&?][^&=]+=(*SKIP)(*FAIL)|=
正则表达式解释:
[&?]
- 确切地匹配&
或?
[^&=]+
- 匹配&
和=
=
- 匹配=
(因此,我们匹配key
)(*SKIP)(*FAIL)
- 此时匹配失败的动词(我们不会替换=
之后找到的key
)=
- 我们匹配任何其他=
,我们会将其删除。以下是IDEONE demo:
$re = "/[&?][^&=]+=(*SKIP)(*FAIL)|=/";
$str = "http://google.com?key=aa=bb\nhttp://google.com?key=aa=bb=cc\nhttp://google.com?key=aa=bb&key2=cc";
$result = preg_replace($re, "%3d", $str);
echo $result;
答案 3 :(得分:0)
这个怎么样?
preg_replace_callback("/=([^&$]+)/", "myReplace", "http://www.example.com?key=aaa=bbb=ccc&key3=dddd");
function myReplace($matches) {
return "=" . urlencode($matches[1]);
}
答案 4 :(得分:0)
只需添加一个附录,解释您的具体尝试:
waiting...
got a (1, 2)
got a (2, 1)
got a (4, 4)
got a (5, 0)
got a (6, 8)
got a (6, 9)
got a (8, 3)
got a (9, 5)
got a (9, 7)
got a (10, 6)
got a (100, None)
waited
虽然前瞻是一个好主意,但它确实只匹配一个角色。在这种情况下,只会断言下一个字符不是preg_replace("/=(?=[^&])=/",
↑ ↑
。
你可以把它改成:
&
我猜是你尝试过的。请注意,这仅忽略每秒preg_replace("/=([^&=]+)\K=/",
↑
等号。所以只适合你的简单示例查询字符串,而不是更丰富的非转义字符。