Php 使用正则表达式对查询字符串中的等号进行编码

Php 使用正则表达式对查询字符串中的等号进行编码,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个查询字符串,它可能类似于以下内容之一: ?键=aa=bb ?键=aa=bb=cc ?键=aa=bb和键2=cc 等等 我想做的是只替换值部分的等号。因此,它应该导致: ?键=aa%3dbb ?键=aa%3dbb%3dcc ?键=aa%3dbb和键2=cc 我正试图通过使用前瞻来使用下面的正则表达式来实现这一点。但它什么也没做 echo preg_replace("/=(?=[^&])=/", "%3d", 'http://www.example.com?key=aaa=bbb=c

我有一个查询字符串,它可能类似于以下内容之一:

?键=aa=bb ?键=aa=bb=cc ?键=aa=bb和键2=cc 等等

我想做的是只替换值部分的等号。因此,它应该导致:

?键=aa%3dbb ?键=aa%3dbb%3dcc ?键=aa%3dbb和键2=cc 我正试图通过使用前瞻来使用下面的正则表达式来实现这一点。但它什么也没做

echo preg_replace("/=(?=[^&])=/", "%3d", 'http://www.example.com?key=aaa=bbb=ccc&key3=dddd');
我怎样才能做到这一点

(\bkey\d*)=(*SKIP)(*F)|=
试试这个。看演示


您不需要正则表达式,请使用适当的工具。解析_url以获取查询字符串和任何您想要的内容,然后解析_str以获取var/vals的数组。然后http_build_查询将为您编码:

$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);

下面是另一个基于与vks'相同方法的正则表达式版本:

[&?][^&=]+=(*SKIP)(*FAIL)|=
正则表达式解释:

[&?]-匹配与否?字面上 [^&=]+-匹配除和以外的字符= 所以,我们匹配了一个键 *SKIP*FAIL-此时匹配失败的动词,我们不替换在键后找到的this= =-我们匹配任何其他=并将其删除。 这是:

这个怎么样

preg_replace_callback("/=([^&$]+)/", "myReplace", "http://www.example.com?key=aaa=bbb=ccc&key3=dddd");

function myReplace($matches) {
  return "=" . urlencode($matches[1]);
}

只需添加一个附录,解释您的具体尝试:

preg_replace("/=(?=[^&])=/",
                 ↑      ↑
虽然前瞻是一个好主意,但它实际上只会匹配一个角色。在这种情况下,我们会断言下一个字符不是&

您可以将其重构为:

preg_replace("/=([^&=]+)\K=/",
                         ↑
我猜这就是你所尝试的。请注意,这只会忽略每秒=………=等号。因此,它只适合简单的示例查询字符串,而不适合更丰富的未转义字符。

为什么不简单地使用?
preg_replace("/=(?=[^&])=/",
                 ↑      ↑
preg_replace("/=([^&=]+)\K=/",
                         ↑