php strpos文本文件中缺少匹配项

时间:2018-05-22 14:29:25

标签: php strpos

我有一段代码在文本文件中搜索电子邮件地址,并在同一行返回两个数字。 该文件看起来像:

range.location = /* some new value */;
AXValueRef newValue = AXValueCreate(kAXValueTypeCFRange, &range);
if (newValue)
{
    AXError setError = AXUIElementSetAttributeValue(focussedElement, kAXSelectedTextRangeAttribute, newValue);
    /* check setError and handle as appropriate */
    CFRelease(newValue);
}
else
    /* handle failure */;

我的代码目前看起来像

24/08/2017,email@test.ie,1,2
21/05/2018,test@234.com,1,2
21/05/2018,test@test.ie,2,2

当我运行此代码时,通过一个HTML表单接收要搜索的电子邮件地址,它只查找匹配的电子邮件,如果它们是最后输入的 - 在上面的示例中,test @234.com将不会返回比赛,但test@test.ie会。我错过了什么阻止它出现比赛?

2 个答案:

答案 0 :(得分:1)

当您找到答案时,您不会终止循环,这意味着即使找到匹配并覆盖之前的任何匹配,它也会继续运行。在您分配break;$foundGroup后添加$foundVideo

您还有两个评估检查相同的事情。在循环开始时将$found标志设置为false。如果你的循环找不到匹配,那么它仍然是假的。你不需要比较两次。

$found = false;

foreach ($lines as $line){      
    if (strpos($line, $email) !==false){
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 
        break; // stop searching for more matches
    }
}

答案 1 :(得分:0)

这实际上很容易理解。

  

如果它们是最后输入的

,它只会找到匹配的电子邮件

这是事实。为什么?因为您始终将$found设置为false,除非您要搜索的电子邮件地址是最后一个。即使您找到匹配项,也只是继续循环并使用$found覆盖false

看一下this snippet,看看你是否能搞清楚。

您需要突破循环,或停止以这种方式设置$found

foreach ($lines as $line){      
    if (strpos($line, $email) !==false) {
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 

    }
    elseif (strpos($line, $email) ===false) {
        $found = false; // This will be run every loop!
    }
}