请记住我打开的文件可以是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>";
}
?>
答案 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
的行。这只适用于匹配字符串不能包含换行符的情况。