2013-07-03 108 views
1

在PHP中,小写当使用URL编码进行urlencode(),输出的字符是大写:进行urlencode在PHP

echo urlencode('MyString'.chr(31)); 
//returns 'MyString%1F' 

我需要让PHP给我回来“的MyString%1F”为上面的例子,但不小写字符串的任何其他部分。以便与其他平台保持一致。有没有什么办法可以做到这一点,而不必一次穿过字符串一个字符,找出是否需要每次更换套管?

+0

貌似输出仍然'的MyString% 1F' – JunM

回答

3

你为什么要这么做? Ff,它不应该有任何区别为percent encoding is ment to be case-insensitive。我能想到的唯一情况是创建散列时,但是我个人会将整个字符串转换为大写或小写,即将其视为不区分大小写。

不管怎么说,如果你真的需要做到这一点,那么就应该使用preg_replace_callback相对容易:

$original = 'MyString%1F%E2%FOO%22'; 
$modified = preg_replace_callback('/%[0-9A-F]{2}/', function(array $matches) 
{ 
    return strtolower($matches[0]); 
}, 
$original); 

var_dump($modified); 

这应该给你:

string(18) "MyString%1f%e2%FOO%22" 
+0

我在复制一个接口,它的确切响应。我已经克服了一些其他的差异,但这让我很难过。我试图尽可能地使用内置的函数,以尽量减少开销并保持性能。 – devgorilla

+1

该模式并不完全正确 - 它匹配的是''和''(并且碰巧与您的示例匹配),但不匹配''。更好的模式是'/%[0-9A-F] {2} /''。这是安全的,因为数字不受'strtolower'的影响。 – Synchro

+0

不知道我在想什么@Synchro,当然这种模式是错误的,我会更新我的答案。 – ndm