查找文件中所有出现的字符串

时间:2013-02-22 16:12:29

标签: php string file loops

请记住我打开的文件可以是10mb到125mb。我已经研究了各种打开文件的方法,如果最好的话,我仍然不确定最好的方法。请指教!

我打开一个大文件,并尝试在每次第一次出现时在两个字符串之间提取文本。我可以找到第一个字符串并将文本提取到第二个字符串,但是,我的循环给了我12次结果(字符串出现在这个文件中的次数。我可以看到我在循环中做错了什么,基本上找到了第一次出现并重复输出12次。如何在文件中循环并在2-12次出现之间获取文本?

此外,正确打开大文件和处理内存限制的任何提示都会很棒。

如果将其放入数组中,我是否会丢失空格?我正在使用PRE来正确显示它。最终,我想解析在数组或数据库中找到的较小元素中的每个字符串。我不想超越自己,所以如有必要,请忽略数组注释。

<?php
ini_set('memory_limit', '-1');

/*
Functions
*/

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

/*
Pre Loop
*/

$string1 = "String 1";
$string2 = "String 2";

$report = file_get_contents('report.rpt','r');

$cbcount = substr_count($report,$string1);

echo $cbcount;

/*
Loop
*/

for ($i=0; $i<$cbcount; $i++){

$output = get_string_between($report, $string1, $string2); 

echo "<pre>".$output."</pre>";

}

?>

2 个答案:

答案 0 :(得分:2)

你实际上从来没有推进任何类型的指针,所以它无法知道它已经找到了第一场比赛。

现在,根据您的输入,您可能只能使用正则表达式:

preg_match_all("(".preg_quote($string1).".*?".preg_quote($string2).")s",$report,$matches);

(用此替换整个循环)

然后您可以var_dump($matches[0])查看您的输出。

答案 1 :(得分:0)

$startfrom = 0;
while (($start = strpos($string1, $report, $startfrom)) !== false) {
    $end = strpos($string2, $report, $start);
    echo "<pre>".substr($report, $start, $end-$start)."</pre>";
    $startfrom = $end + 1;
}

关于处理大文件,而不是将整个内容读入内存,您可以使用fopen()fgets()逐行读取它。当您找到包含$string1的行时,您开始在变量中累积行,直到找到包含$string2的行。这只适用于匹配字符串不能包含换行符的情况。