2013-04-10 116 views
0

我有一些代码可以搜索一个巨大的日志文件并找到一个关键字,对于大多数情况下这是靠近文档的底部。在这种情况下,从底部开始我的搜索并继续工作会更有效率。Stripos从字符串末尾开始

$pos = stripos($body,$keyword); 
$snippet_pre = substr($body, $pos, SNIPPET_LENGTH); 

我已经看了strripos,虽然它做什么,我想在找到最后一次出现,它听起来就像是从文档的开头搜索如此虐待被添加了许多不必要的工作,我的查询作为大部分关键字都靠近字符串/文档的底部

任何想法?

+0

就这样,我没有用解决方案跳过枪,在我做之前。你能展示一个你正在搜索的字符串的例子吗?和你正在把你的条带放入的参数? – 2013-04-10 00:30:37

回答

1

通过换行符分解您的日志文件以获取数组。颠倒你的数组,现在你可以从结尾逐行搜索。

$lines = explode("\n",$body); 
$reversed = array_reverse($lines); 
foreach($reversed AS $line) { 
    // Search for your keyword 
} 

如果你谈论的是一个巨大的日志文件,这样,你绝对不希望它全部读入内存,你也可以看一个反向寻求办法,尽管这通常是没有必要的。在这里看到:

Read a file backwards line by line using fseek

+0

我没有看到像这样的解决方案的缺点,它似乎像这样的逻辑解决方案 – 2013-04-10 00:37:10

-1

strripos将从月底开始,如果你设置了负作为第三个参数偏移向后搜索。

$pos = stripos($body,$keyword,$offset); 
+0

负偏移量如何工作,我可以只设置-1,它从头开始? – user1547410 2013-04-10 07:12:25

+0

使用负偏移量时,搜索将从字符串末尾的许多字符开始。所以-1偏移量将从字符串的末尾开始搜索一个字符。即使搜索是倒退的,返回值仍然是相对于字符串的开始。 – user1613098 2013-04-10 14:30:40