这个问题让我困惑了几天,我非常感谢有人可以帮忙解决这个问题。
我在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;
?>
答案 0 :(得分:3)
问题是变量$host
同时用于两个不同的目的。它主要代表正在处理的主机名(相反,作为有些过度设计的算法的一部分)。但是在这一行上,相同的变量名称用于数组:
$host = explode('.', substr($host, strlen($suffix)));
一旦该行运行,所有期望变量的先前含义的代码将出错或做错事。
您需要在该行上分配新的变量名称,例如$host_parts
,并确定哪些对$host
的引用实际应该属于此数组($host_parts
)。
请注意,这主要是一个问题,因为代码在循环中。查看算法时,它可能会在第一次匹配后停止,并且位置适当break
statement。即便如此,重复使用这样的变量名称通常也是一个坏主意。