-1

为什么我收到未初始化的字符串错误,我无法弄清楚?

这是我的功能:

function show_site_name($url,$lenght)
{
    $name='';
    $i=0;
    $slash=0;
    while($slash<3 && $i<=$lenght)
    {
        if($url[$i]=='/') $slash++;
        if($url[$i]!='/' && $slash==2) $name.=$url[$i];
        $i++;
    }
    return($name);
}

编辑:我在这两行收到“未初始化的字符串偏移”错误:

    if($url[$i]=='/') $slash++;
    if($url[$i]!='/' && $slash==2) $name.=$url[$i];
4

1 回答 1

0

该功能相当愚蠢。PHP 提供了很好的原生函数来解析 url。另外,我假设“长度”是第一个参数的长度?当然可以用strlen.

show_site_name('http://www.example.com', strlen('http://www.example.com'));

将导致Uninitialized string offset: 22.

show_site_name('http://www.example.com', strlen('http://www.example.com')-1);

以上可能是你想要的。选项基数为零,而不是一。

if($url[$i]=='/') $slash++;

上面的行是您超过字符串偏移量的地方。糟糕的逻辑。您可以修复代码并避免它或使用isset. 相信你的错误日志。

更新:

你可以通过像我展示的那样传递理智的论点来避免它。或将其更改为:

if (isset($url[$i])) {
    if($url[$i]=='/') $slash++;
} else {
    return $name;
}

但同样,这只是愚蠢的。

如果您坚持这样做,我们称之为学习目的。为什么不这样做:

function show_site_name($url)
{
    $lenght = strlen($url) -1;
    ...

传递可以简单地从第一个参数派生的第二个参数不是一个好方法。

于 2018-07-18T16:42:34.047 回答