【发布时间】:2017-11-08 22:08:01
【问题描述】:
我想用百分比编码表示 (%xy) 替换字符串中的所有字符,但只替换尚未进行百分比编码的字符。
例如,在字符串 abc#%2Bdef 中,%2B 部分已经是百分比编码的表示形式。所以它不应该被重新编码。编码后正确的结果应该是:abc%23%2Bdef。
这是我尝试过的——但结果仍然是abc#%2Bdef:
// Pattern: read all characters except the percent-encoded ones (%xy).
$pattern = '/(?!%[a-fA-F0-9]{2})/';
$string = 'abc#%2Bdef';
$result = preg_replace_callback($pattern, function($matches) {
return rawurlencode($matches[0]);
}, $string);
var_dump($result);
我认为应该更改的只是 $patternvalue,但我不确定。在当前模式下,不会调用回调中的rawurlencode()。
编码图例:%23 -> #、%2B -> +
我今天试了好几个小时才找到正确的图案形式。一开始看起来很简单......我非常感谢任何建议或解决方案。
非常感谢。
【问题讨论】:
-
这真的没有意义。如果百分比是字面的,而不是百分比编码的一部分呢?你如何得到一个字符串,它的一部分是 url 编码的,而不是全部?
-
谢谢你,@Barmar。嗯,你问了我一个很好的问题。给我一点时间考虑一下。
-
@aendeerei 我想你应该可以一直打电话给
urlencode()。如果您的代码输入已经被编码,那是因为您试图通过嵌套的 URL 编码字符串。例如,一个 URL 参数可以是另一个 URL,并且该内部 URL 可能包含 URL 编码的参数。它们需要进行双重编码。
标签: php regex url encoding character-encoding