【问题标题】:Find all occurrences of a string in a file查找文件中所有出现的字符串
【发布时间】:2013-02-22 16:12:29
【问题描述】:

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

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

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

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

<?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>";

}

?>

【问题讨论】:

    标签: php string file loops


    【解决方案1】:

    你从来没有真正推进任何类型的指针,所以它无法知道它已经找到了第一个匹配项。

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

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

    (用这个替换整个循环)

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

    【讨论】:

    • 0 => string 'found'... (length=5048) 我看不到每个是否都是唯一的,因为输出似乎没有显示完整的字符串。上面的格式是什么意思?字符串已替换为“找到”。谷歌搜索 '... (length=5048) 什么也没有。不过,我确实在数组中得到了 12 个字符串。这是正确的。
    • 我使用了 print_r($matches);我得到了整个字符串。它都在那里!感谢您的帮助。
    【解决方案2】:
    $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 的行。这仅在匹配字符串不能包含换行符时才有效。

    【讨论】:

    • 我稍后会检查这个。换行符在我的列表中,以便与 fgets() 和其他人一起检查。感谢您的回复。
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多