【问题标题】:urlencode to lower case in PHP在 PHP 中将 urlencode 转换为小写
【发布时间】:2013-06-30 21:06:10
【问题描述】:

在 PHP 中,使用 urlencode() 进行 url 编码时,输出的字符为大写:

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

对于上述示例,我需要让 PHP 将“MyString%1f”返回给我,但不要将字符串的任何其他部分小写。为了与其他平台保持一致。有没有什么办法可以做到这一点,而不必一次遍历一个字符,确定是否每次都需要更改大小写?

【问题讨论】:

  • 看起来输出还是MyString%1F

标签: php urlencode url-encoding lowercase


【解决方案1】:

您为什么要这样做? 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"

【讨论】:

  • 我正在复制一个界面,它的响应是准确的。我已经克服了其他一些差异,但这让我很难过。我正在尝试尽可能使用内置函数来最小化开销并保持性能。
  • 该模式不太正确 - 它与 <digit><hexletter><digit><hexletter> 匹配(恰好与您的示例匹配),但不匹配 <hexletter><hexletter>。更好的模式是'/%[0-9A-F]{2}/'。这是安全的,因为数字不受strtolower 的影响。
  • 不知道我在想什么@Synchro,当然模式是错误的,我会更新我的答案。
猜你喜欢
  • 2011-08-12
  • 2012-06-16
  • 2018-08-18
  • 2018-08-17
  • 2011-07-21
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多