Php 如果尚未编码,则编码字符(使用rawurlencode和preg_replace_回调)
我想将字符串中的所有字符替换为其百分比编码表示形式(Php 如果尚未编码,则编码字符(使用rawurlencode和preg_replace_回调),php,regex,url,encoding,character-encoding,Php,Regex,Url,Encoding,Character Encoding,我想将字符串中的所有字符替换为其百分比编码表示形式(%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})/'
%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);
我认为应该更改的只是$pattern
值,但我不确定。在当前模式下,不会调用回调中的rawurlencode()
编码图例:%23->
,%2B->+
我今天花了好几个小时才找到合适的图案。一开始看起来很简单。。。我真的很感激任何建议或解决方案
非常感谢。最简单的方法是先解码先前编码的字符,然后重新编码所有字符串
$string = 'abc#%2Bdef';
$string = rawurlencode(rawurldecode($string));
这会给你预期的结果
abc%23%2Bdef
这真的没有道理。如果百分比是文字,而不是百分比编码的一部分,该怎么办?你是如何得到一个部分是url编码的字符串的,而不是全部?试试吧,谢谢你,@Barmar。你问了我一个好问题。给我一点时间考虑一下。看看@aendeere我想你应该可以一直调用
urlencode()
。如果代码的输入已经编码,那是因为您试图传递嵌套的URL编码字符串。例如,一个URL参数可以是另一个URL,而该内部URL可能包含URL编码的参数。它们需要双重编码。非常感谢你,琴。给我一点时间检查和测试,我一定会回来找你。@aenderei当然:)我很感激:-)Chin,这将比预期的要花更多的时间。我想我今天再也查不到了。明天我可以给你我的反馈吗?谢谢。@aenderei是的,当然:)