注意这不是一个面试题,也别喷『谁写出这样代码拉出去枪毙 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?
1
Arrowing 2017-07-24 12:17:36 +08:00
谷歌,好像没掉坑里吧? (捂脸。。。
好久没碰 PHP 了,现在可以数组可以直接用[]了么? |
2
ety001 2017-07-24 12:20:26 +08:00
360
|
3
580a388da131 2017-07-24 12:20:40 +08:00
@Arrowing 5.4 开始就可以了,现在都到 7 了
|
4
gdtv 2017-07-24 12:21:40 +08:00
我测试了一下,返回的是“ 360 ”,求解释
|
5
XiLiGe 2017-07-24 12:27:27 +08:00
360
|
6
elvodn 2017-07-24 12:29:18 +08:00
strpos("$link", "$key")
|
7
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 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。 |
8
jfcherng 2017-07-24 12:31:52 +08:00 1
$key 裡的 '360' 被當成了 int 解釋,於是成了 `if (strpos('h...', 360) !== false)`
而 360 轉成 ascii char,360%128 = 104 = 'h',於是 `strpos('h...', 360)` 返回 0 可能是這樣? |
9
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' |
10
yalanaika 2017-07-24 12:45:10 +08:00
弱类型在这里真的太可怕了
|
11
solaro 2017-07-24 12:49:20 +08:00
哎呦,有点意思
|
12
mooncakejs 2017-07-24 12:51:05 +08:00 via iPhone
这这个陨石坑啊
|
13
reus 2017-07-24 12:57:18 +08:00
PHP 是世界上最垃圾的语言
|
14
0x0 2017-07-24 13:01:00 +08:00 1
CTF 又有新素材了…
|
15
levn 2017-07-24 13:04:51 +08:00 1
是数组键值的类型转换不是 strpos 吧。
“ key 可以是 integer 或者 string。value 可以是任意类型。 此外 key 会有如下的强制转换: 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。 Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。 ” |
16
Takahashi 2017-07-24 13:11:43 +08:00
strpos()和 strstr()是一回事吗
|
17
sagaxu 2017-07-24 14:00:39 +08:00
list/map 不分是个坑,动态类型是个巨坑,弱类型是个天坑。最好的语言,门槛很低,坑很深
|
18
fork3rt 2017-07-24 14:05:12 +08:00 1
强制转一下类型就好了。
if (strpos($link, strval($key)) !== false) { return $value; } |
19
nfroot 2017-07-24 14:28:28 +08:00
居然坑这么大 吓死人!
|
21
quericy 2017-07-24 14:48:09 +08:00 1
就算不踩坑,逻辑还是有问题
getReferer('https://www.google.com/#q=baidu'); |
23
RLib 2017-07-24 15:22:08 +08:00
哦, 有问题
|
24
joeke 2017-07-24 15:29:43 +08:00 1
弱类型很可怕啊,这种问题 还很难找出来的,坑了
|
25
zjsxwc 2017-07-24 15:52:15 +08:00
使用 mb 系列的字符串操作,试试 mb_strpos
|
26
leafx 2017-07-24 16:34:30 +08:00
好吧,我承认我应该被拉出枪毙 5 分钟,
|
27
imbin 2017-07-24 22:54:23 +08:00
好吧 我也一下子没看出坑的位置
|
28
chahualao 2017-07-25 17:23:58 +08:00
我不适合当程序员
|