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

2017-07-24 12:00:51 +08:00
 Jakesoft

注意这不是一个面试题,也别喷『谁写出这样代码拉出去枪毙 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?

5748 次点击
所在节点    PHP
30 条回复
Arrowing
2017-07-24 12:17:36 +08:00
谷歌,好像没掉坑里吧? (捂脸。。。
好久没碰 PHP 了,现在可以数组可以直接用[]了么?
ety001
2017-07-24 12:20:26 +08:00
360
580a388da131
2017-07-24 12:20:40 +08:00
@Arrowing 5.4 开始就可以了,现在都到 7 了
gdtv
2017-07-24 12:21:40 +08:00
我测试了一下,返回的是“ 360 ”,求解释
XiLiGe
2017-07-24 12:27:27 +08:00
360
elvodn
2017-07-24 12:29:18 +08:00
strpos("$link", "$key")
FYK
2017-07-24 12:30:45 +08:00
strpos:( https://secure.php.net/manual/zh/function.strpos.php):

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

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

可能是這樣?
niuoh
2017-07-24 12:33:20 +08:00
strpos('h',360)!==false

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


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

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

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

if (strpos($link, strval($key)) !== false) {
return $value;
}
nfroot
2017-07-24 14:28:28 +08:00
居然坑这么大 吓死人!
RLib
2017-07-24 14:40:47 +08:00
@Takahashi
返回值不同而已, 查找一致

除了楼上的坑, 再补个, 是否应该考虑 stripos

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

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

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

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

© 2021 V2EX