请教一下大神们关于 PHP 的 urlencode?

2017-07-25 10:10:35 +08:00
 mmnnyycc
1.对接的一个 urlencode 规则是除了字符数字_三种,其他的全部转化为%后面跟两位的 16 进制数
2.urlencode 文档:字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+),不符合
3. 使用 rawurlencode(),-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。
问题就是:将使用 rawurlencode()后没有转义的-和.替换为转义的%2D 和%2E

$a = '中国 de www 人.min-guo';
$b = rawurlencode($a);
str_replace('.','%2E',$b);
str_replace('-','%2D',$b);
$b = strtoupper($b);
echo $b;

输出的结果并没有替换:%E4%B8%AD%E5%9B%BDDE%20WWW%E4%BA%BA.MIN-GUO
1898 次点击
所在节点    程序员
14 条回复
xqin
2017-07-25 10:15:54 +08:00
```
$b = str_replace('.','%2E',$b);
$b = str_replace('-','%2D',$b);
```

str_replace 又不是原地替换, 所以你要把返回值再次赋值给 $b
mmnnyycc
2017-07-25 10:29:04 +08:00
@xqin 是的,就这-和.两种,请问还有其他的更好的方法吗?总感觉这方法不太好
surfire91
2017-07-25 10:40:42 +08:00
@mmnnyycc 这个方法感觉哪里不好?
vainl1
2017-07-25 10:42:51 +08:00
`$b = str_replace(['.','-'], ['%2E','%2D'], $b);`
mmnnyycc
2017-07-25 10:44:18 +08:00
@surfire91 不优雅
mmnnyycc
2017-07-25 10:45:25 +08:00
@vainl1 哇,这个好
gouchaoer
2017-07-25 10:47:01 +08:00
你是要能在 url 中传的 encode 么?有专门的版本
mmnnyycc
2017-07-25 11:00:52 +08:00
@gouchaoer 我看了下就 urlencode 和 rawurlencode,不过规则是除了数字字符下划线其他全部转义,rawurlencode 比较符合,但是差了两个-和.
surfire91
2017-07-25 15:13:33 +08:00
@mmnnyycc 只是要好看点么,还有个方法 string strtr ( string $str , array $replace_pairs )

其实更好奇你是什么需求,一般 urlencode/rawurlencode 都满足了
mmnnyycc
2017-07-25 15:18:16 +08:00
@surfire91 写那么一大坨,估计没看完,urlencode/rawurlencode 不会转义.和-,对接的接口需要
sagaxu
2017-07-25 15:21:16 +08:00
@mmnnyycc 不同语言和库的 urlencode 的定义是不同的,接口中不应该依赖这种行为
surfire91
2017-07-25 15:24:54 +08:00
@mmnnyycc 我知道不转义,所以给你建议了 string strtr ( string $str , array $replace_pairs ) 。

后面一句只是好奇问下你的需求而已。
lianxiaoyi
2017-07-26 09:24:23 +08:00
所以遇到传中文或者网址啊等等等需要转码的东西。我都经过 base64_encode 打成一个字符串,然后再替换掉 base64 里的 = 字符,例如将 = 替换为 _a 等等 ,需要用的时候再反解析回来。。。。。。有时 TM 传着传着就混了
mmnnyycc
2017-07-26 09:33:09 +08:00
@lianxiaoyi 这对接的文档就写着字母数字下划线以外全部转义,只能这么来了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/377737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX