2013-07-03 148 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