stripos()期望参数1为字符串

时间:2015-04-10 23:34:14

标签: php

这个问题让我困惑了几天,我非常感谢有人可以帮忙解决这个问题。

我在apache + Ubuntu 14.04 64上运行wp。

有人给我写了一些小的PHP代码来显示来自文本文件的即将到来的url和match / display关键字(说aaa.txt,而不是数据库)。

代码是“聪明的”,但有一些PHP错误。但我无法纠正它:

  

警告:stripos()期望参数1为字符串,数组为   {edited} .php(373):第15行的eval()代码

似乎if (0 === strpos($host, $suffix)) {不正确,但我是新手,如何改变它?

以下是代码:

define('ROOT', dirname(__FILE__));
@$cnText = file_get_contents('aaa.txt');
$cnText = str_replace('?', '', $cnText);
$cnText = preg_split('/\n|\r\n/', $cnText);
foreach ($cnText as $text) {
    $pos = strpos($text, ' ');
    $cnText[substr($text, 0, $pos)] = trim(substr($text, $pos));
}
$host = strrev(strtolower($_SERVER['HTTP_HOST']));
$domain = null;
$domainSuffix = array('.com.cn','.net.cn','.org.cn','.gov.cn','.com','.cn','.net','.cc','.org','.info','.biz','.tv','.guru');
$keyword = array();
foreach ($domainSuffix as $suffix) {
    $suffix = strrev($suffix);
if (0 === strpos($host, $suffix)) {
        $host = explode('.', substr($host, strlen($suffix)));
        $keyword[0] = strrev($host[0]);
        if(0 === strpos($keyword[0], 'xn--')) {
            require_once('idna_convert.class.php');
            $IDN = new idna_convert();
            $keyword[0] = $IDN->decode($keyword[0]);
        }
        $domain = $keyword[0] . strrev($suffix);
    }
     }
if (!empty($domain)) {
    $keywords = '';
    if (array_key_exists($domain, $cnText)) {
        $data = explode(' ', $cnText[$domain]);
        foreach($data as $key => $value) {
            $value = trim($value);
                $keyword[$key] = $value;
                $keywords .= " $value";
            }
        }
    }
    echo $keywords;
?>

1 个答案:

答案 0 :(得分:3)

问题是变量$host同时用于两个不同的目的。它主要代表正在处理的主机名(相反,作为有些过度设计的算法的一部分)。但是在这一行上,相同的变量名称用于数组:

$host = explode('.', substr($host, strlen($suffix)));

一旦该行运行,所有期望变量的先前含义的代码将出错或做错事。

您需要在该行上分配新的变量名称,例如$host_parts,并确定哪些对$host的引用实际应该属于此数组($host_parts)。

请注意,这主要是一个问题,因为代码在循环中。查看算法时,它可能会在第一次匹配后停止,并且位置适当break statement。即便如此,重复使用这样的变量名称通常也是一个坏主意。