V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mmnnyycc
V2EX  ›  程序员

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

  •  
  •   mmnnyycc · 2017-07-25 10:10:35 +08:00 · 1914 次点击
    这是一个创建于 2671 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    
    14 条回复    2017-07-26 09:33:09 +08:00
    xqin
        1
    xqin  
       2017-07-25 10:15:54 +08:00
    ```
    $b = str_replace('.','%2E',$b);
    $b = str_replace('-','%2D',$b);
    ```

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

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

    后面一句只是好奇问下你的需求而已。
    lianxiaoyi
        13
    lianxiaoyi  
       2017-07-26 09:24:23 +08:00
    所以遇到传中文或者网址啊等等等需要转码的东西。我都经过 base64_encode 打成一个字符串,然后再替换掉 base64 里的 = 字符,例如将 = 替换为 _a 等等 ,需要用的时候再反解析回来。。。。。。有时 TM 传着传着就混了
    mmnnyycc
        14
    mmnnyycc  
    OP
       2017-07-26 09:33:09 +08:00
    @lianxiaoyi 这对接的文档就写着字母数字下划线以外全部转义,只能这么来了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1434 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:36 · PVG 01:36 · LAX 09:36 · JFK 12:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.