Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果尚未编码,则编码字符(使用rawurlencode和preg_replace_回调)_Php_Regex_Url_Encoding_Character Encoding - Fatal编程技术网

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是的,当然:)