V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Jakesoft
V2EX  ›  PHP

时至如今,我还是要你们回答这个问题

  •  
  •   Jakesoft · Jul 24, 2017 · 6810 views
    This topic created in 3200 days ago, the information mentioned may be changed or developed.

    注意这不是一个面试题,也别喷『谁写出这样代码拉出去枪毙 5 分钟』,顺便说一句,我确实写过这样的代码...

    <?php
    function getReferer($link)
    {
        $refMap = [
            'baidu' => '百度',
            'sougou' => '搜狗',
            '360' => '360',
            'google' => '谷歌'
        ];
        foreach ($refMap as $key => $value) {
            if (strpos($link, $key) !== false) {
                return $value;
            }
        }
        return '其他';
    }
    echo getReferer('https://www.google.com/search?workd=%FD%##%#%E%D%D%D%D%D%D%');
    

    so, what's the output?

    30 replies    2017-07-29 17:00:49 +08:00
    Arrowing
        1
    Arrowing  
       Jul 24, 2017
    谷歌,好像没掉坑里吧? (捂脸。。。
    好久没碰 PHP 了,现在可以数组可以直接用[]了么?
    ety001
        2
    ety001  
       Jul 24, 2017
    360
    580a388da131
        3
    580a388da131  
       Jul 24, 2017
    @Arrowing 5.4 开始就可以了,现在都到 7 了
    gdtv
        4
    gdtv  
       Jul 24, 2017
    我测试了一下,返回的是“ 360 ”,求解释
    XiLiGe
        5
    XiLiGe  
       Jul 24, 2017
    360
    elvodn
        6
    elvodn  
       Jul 24, 2017
    strpos("$link", "$key")
    FYK
        7
    FYK  
       Jul 24, 2017
    strpos:( https://secure.php.net/manual/zh/function.strpos.php):

    mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

    如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
    jfcherng
        8
    jfcherng  
       Jul 24, 2017   ❤️ 1
    $key 裡的 '360' 被當成了 int 解釋,於是成了 `if (strpos('h...', 360) !== false)`
    而 360 轉成 ascii char,360%128 = 104 = 'h',於是 `strpos('h...', 360)` 返回 0

    可能是這樣?
    niuoh
        9
    niuoh  
       Jul 24, 2017
    strpos('h',360)!==false

    strpos 函数 第二个参数为整数时自动转成 ascii 码 360 大于 256 个 ascii 码总数 所以把他减去 256 的 360-256=104
    chr(104)='h'
    yalanaika
        10
    yalanaika  
       Jul 24, 2017
    弱类型在这里真的太可怕了
    solaro
        11
    solaro  
       Jul 24, 2017
    哎呦,有点意思
    mooncakejs
        12
    mooncakejs  
       Jul 24, 2017 via iPhone
    这这个陨石坑啊
    reus
        13
    reus  
       Jul 24, 2017
    PHP 是世界上最垃圾的语言
    0x0
        14
    0x0  
       Jul 24, 2017   ❤️ 1
    CTF 又有新素材了…
    levn
        15
    levn  
       Jul 24, 2017   ❤️ 1
    是数组键值的类型转换不是 strpos 吧。


    key 可以是 integer 或者 string。value 可以是任意类型。

    此外 key 会有如下的强制转换:

    包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
    浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
    布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
    Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
    数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
    Takahashi
        16
    Takahashi  
       Jul 24, 2017
    strpos()和 strstr()是一回事吗
    sagaxu
        17
    sagaxu  
       Jul 24, 2017
    list/map 不分是个坑,动态类型是个巨坑,弱类型是个天坑。最好的语言,门槛很低,坑很深
    fork3rt
        18
    fork3rt  
       Jul 24, 2017   ❤️ 1
    强制转一下类型就好了。

    if (strpos($link, strval($key)) !== false) {
    return $value;
    }
    nfroot
        19
    nfroot  
       Jul 24, 2017
    居然坑这么大 吓死人!
    RLib
        20
    RLib  
       Jul 24, 2017
    @Takahashi
    返回值不同而已, 查找一致

    除了楼上的坑, 再补个, 是否应该考虑 stripos
    quericy
        21
    quericy  
       Jul 24, 2017   ❤️ 1
    就算不踩坑,逻辑还是有问题
    getReferer('https://www.google.com/#q=baidu');
    RLib
        22
    RLib  
       Jul 24, 2017
    @quericy 这个没问题, 识别的是谷歌
    RLib
        23
    RLib  
       Jul 24, 2017
    哦, 有问题
    joeke
        24
    joeke  
       Jul 24, 2017   ❤️ 1
    弱类型很可怕啊,这种问题 还很难找出来的,坑了
    zjsxwc
        25
    zjsxwc  
       Jul 24, 2017
    使用 mb 系列的字符串操作,试试 mb_strpos
    leafx
        26
    leafx  
       Jul 24, 2017
    好吧,我承认我应该被拉出枪毙 5 分钟,
    imbin
        27
    imbin  
       Jul 24, 2017
    好吧 我也一下子没看出坑的位置
    chahualao
        28
    chahualao  
       Jul 25, 2017
    我不适合当程序员
    chahualao
        29
    chahualao  
       Jul 25, 2017
    @levn
    $arr = [
    '8'=>'八',
    '8.7'=>'八点七',
    '0.6'=>'零点六',
    ];

    经过 foreach 后 key:
    int(8)
    string(3) "8.7"
    string(3) "0.6"
    90safe
        30
    90safe  
       Jul 29, 2017
    @qfdk 一眼望过去差点没反应过来,弱类型语言好坑
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2640 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 16:02 · PVG 00:02 · LAX 09:02 · JFK 12:02
    ♥ Do have faith in what you're doing.