使用正则表达式在查询字符串中编码等号

时间:2015-07-12 20:55:12

标签: php regex preg-replace

我有一个查询字符串,可能看起来像下列之一:

  1. ?键= AA = BB
  2. ?键= AA = BB = CC
  3. 键= AA = BB&安培;键2 = CC
  4. 我想要做的只是替换值部分中的等号。所以它应该导致:

    1. ?键= AA%3dbb
    2. ?键= AA%3dbb%3DCC
    3. 键= AA%3dbb&安培;键2 = CC
    4. 我正试图通过使用前面的正则表达式来实现这一点。但它没有做任何事情。

      echo preg_replace("/=(?=[^&])=/", "%3d", 'http://www.example.com?key=aaa=bbb=ccc&key3=dddd');
      

      Example code here

      我该如何做到这一点?

5 个答案:

答案 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=/", ↑ 等号。所以只适合你的简单示例查询字符串,而不是更丰富的非转义字符。