【问题标题】:PHP explode work only with last linePHP 仅在最后一行爆炸工作
【发布时间】:2013-07-03 05:49:40
【问题描述】:

我有一个 PHP 脚本,其中包含特殊引用者的不同页面:

$ref_found = false; 

// get referer if exists 
$referer = false; 
if ( isset($_SERVER['HTTP_REFERER']) ) { 
    $referer = $_SERVER['HTTP_REFERER']; 
    // get content of list.txt 
    $list = explode(chr(10), file_get_contents('list.txt')); 
    foreach ( $list as $l ) { 
        if ( strlen($l) > 0 ) { 
            if ( strpos( $referer, $l ) ) { 
                $ref_found = true; 
            } 
        } 
    } 
} 

// include the correct file 
if ( $ref_found ) { 
    require_once('special_page.html'); 
} else { 
    require_once('regular_page.html'); 
} 

Referer DB 位于简单的 txt 文件 (list.txt) 中,如下所示:

domain1.com

domain2.com

domain3.com

不幸的是,此脚本仅适用于列表中的最后一个域 (domain3.com)。

我应该添加什么? \n ?
还是以不同的方式创建域数据库更好?

【问题讨论】:

    标签: php explode http-referer


    【解决方案1】:

    问题在于,当您explode() 您的域名列表时,您最终会在每个项目周围出现空格。至少,您将在某处有一个换行符 (\n),因为文件中的换行符可能是 \r\n

    因此,您正在检查 " domain1.com""\ndomain1.com""domain1.com\n" 之类的内容。由于这个额外的空白不存在于引荐来源标头中,因此它与您期望的不匹配。

    通过对找到的每个值调用trim(),您将获得一个干净的域名,您可以使用它进行更有用的比较:

    $list = explode("\n", file_get_contents('list.txt'));
    foreach ($list as $l) {
        $l =  trim($l);
        if ((strlen($l) > 0) && (strpos($referer, $l) !== false)) {
            $ref_found = true;
            break;
        }
    }
    

    我还对您的代码进行了其他一些小更新:

    1. 我不再使用 chr(),而是使用了字符串文字 ("\n")。只要您使用双引号,它将是文字换行符,而不是实际的 \n,并且对于阅读您的代码的人来说,字符串文字更容易理解。

    2. 我从 "\r" 字符(第 10 章)切换到 "\n" 字符(第 13 章)。有几种不同的换行格式,但最常见的是"\n""\r\n"。通过在"\n" 上展开,您的代码将适用于两种格式,而"\r" 仅适用于第二种格式。

    3. 我合并了你的两个 if 语句。这是一个很小的更新,除了(在我看来)使代码更易于阅读之外没有太大影响。

    4. 我更新了您的 strpos() 以与 false (!==) 进行文字比较。这段代码可能不是问题,因为referrer 值将以http:// 开头,但这是一个好习惯。如果子字符串恰好出现在父字符串的开头,strpos() 将返回 0,这将在您的原始代码中被解释为 false。

    5. 如果您找到匹配的域名,我会在您的循环中添加 break 语句。一旦找到并设置了标志,就没有理由继续检查列表中的其余域,break 允许您取消 foreach 循环的其余部分。

    【讨论】:

    • @user2545134 如果您发现此答案有用,您可以通过单击旁边的复选标记将其标记为已接受的答案。一旦你有更多的代表,你也可以投票任何有用的答案。
    • 完成,“break”很棒,我可以在列表开头设置最受欢迎的域以加快速度
    【解决方案2】:
    chr(13) == "\n"
    chr(10) == "\r"
    

    "\n" 很可能是您想要的。

    【讨论】:

    • 我知道 \n 是什么,而无需参考 ascii 表 :)
    • OPS 问题是 OP 只使用了 \r,
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多