Strpos说它没有找到应该有的字符串

时间:2014-02-26 02:45:30

标签: php strpos

我有这个:

$fi2 = "/var/www/server/poll/ips.txt"; //IP file
$mystring = $_SERVER['REMOTE_ADDR']; //IP according to server
$findme = file_get_contents($fi2);
$pos = strpos($mystring, $findme);
if ($pos === true) {
    echo "Found";
} else {    
    echo "not found"; 
}

但是,即使IP与文本文件中的内容匹配,也不会说“未找到”。我做完了

echo "$mystring $findme"; 

它正确输出我的IP和文本文件。

我被告知我应该替换

if ($pos === true) {

if ($pos !== false) {

我做了什么但它仍然不起作用。

以下是我用来保存到文本文件的代码:

//Record IP
$fi2 = "/var/www/server/poll/ips.txt"; //IP file
file_put_contents($fi2, "\r\n$mystring", FILE_APPEND); //Stick it onto the IP file

5 个答案:

答案 0 :(得分:2)

直接来自strpos()上的手册:

  

返回针存在于相对于haystack字符串开头的位置(与offset无关)。另请注意,字符串位置从0开始,而不是1。

     

如果找不到针,则返回FALSE

结果是数字位置或FALSE,这意味着$pos === true 总是失败!另一个问题是strpos()的签名如下:

  

mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

您混淆了$haystack$needle这可能是由于命名不佳造成的。尝试这样的事情:

$fi2 = "/var/www/server/poll/ips.txt"; //IP file
$ip = $_SERVER['REMOTE_ADDR']; //IP according to server
$file = file_get_contents($fi2);
$pos = strpos($file, $ip);// ($findme, $mystring)
if ($pos !== FALSE) {
    echo "found";
} else {
    echo "not found";
}

答案 1 :(得分:2)

我认为这是三个问题的结合。

首先,如果你加载的文件在ip地址的末尾有一个新行,那么它就不匹配了:

$findme = file_get_contents($fi2);

更改为

$findme = trim(file_get_contents($fi2));

正如其他人指出的那样,你的pos逻辑不正确。

if ($pos !== false) {

编辑:

你的争论顺序也是错误的:

$pos = strpos($findme, $mystring);

答案 2 :(得分:0)

strpos会返回一个数字,如果找不到,则返回false

正确的if语句是:

if ($pos !== false) {

另一个常见错误是写:

if (!$pos) {

但是如果$pos0 - 如果在字符串的开头找到字符串会发生这种情况 - 这个检查也会失败。

答案 3 :(得分:0)

if语句的替代方法:

if(!is_bool($pos)){

答案 4 :(得分:0)

我自己想出来了。

我改变了

file_put_contents($fi2, "\r\n$mystring", FILE_APPEND); //Stick it onto the IP file

file_put_contents($fi2, "$mystring", FILE_APPEND); //Stick it onto the IP file

我不知道为什么修复它(刚刚启动PHP),但这就是它被破坏的原因,所以如果有人提出用原始行修复它的答案,我会接受它。

还需要将$pos === true更改为$pos !== false