仅搜索文本文件的第一列

时间:2013-12-03 14:21:13

标签: php

我有一个包含以下内容的文本文件:

---> 12455  ---> 125  ---> KKK
---> 11366  ---> 120  ---> LLL
---> 12477  ---> 120  ---> YYY

我使用以下PHP代码在文件中搜索“---> 124”,我得到以下结果:

---> 12455  ---> 125  ---> KKK
---> 12477  ---> 120  ---> YYY

但我希望结果如下:

---> 12455  
---> 12477  

我希望它只返回第一列。

<?php
    $file = 'mytext.txt';
    $searchfor = '---> ' . "124";

    // the following line prevents the browser from parsing this as HTML.
    header('Content-Type: text/plain');

    // get the file contents, assuming the file to be readable (and exist)
    $contents = file_get_contents($file);

    // escape special characters in the query
    $pattern = preg_quote($searchfor, '/');

    // finalise the regular expression, matching the whole line
    $pattern = "/^.*$pattern.*\$/m";

    // search, and store all matching occurences in $matches
    if(preg_match_all($pattern, $contents, $matches)) {
        echo implode($matches[0]);
    } else {
        echo "No matches found";
    }
?>

6 个答案:

答案 0 :(得分:2)

首先,分开你的担忧:

  1. 阅读文件
  2. 解析内容
  3. 搜索
  4. 使用迭代器,你可以在这里实现一些很棒的东西,但是需要更深入地了解OOP和迭代器接口。我建议的是一种更简单的方法:

    <?php
    //Read the file line by line
    $handle = fopen('file.txt', 'r');
    while(!foef($handle)){
        $content = fgets($handle);
    
        //Parse the line
        $content = explode('---> ', $content);
    
        //Analyse the line
        if($content[1] == 124){
            echo $content[0]."\n";
        }
    
    }
    fclose($handle);
    

    那应该是它,只是按照你的意愿调整它,我还没有在这里测试代码!

答案 1 :(得分:2)

稍微改变一下你的方法。不要将搜索词和分隔符存储在单个字符串中,而是使用两个变量。

$sep = '--->';
$searchfor = '124';

$pattern = "/^$sep\s+($searchfor\d+)\s+.*/m";

// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
    echo implode(' ', $matches[1])."\n";
}

输出:

12455 12477

Demo.

答案 2 :(得分:1)

如果结构总是如您所示,那么:

  1. 逐行阅读文件;
  2. explode();每行按空格 ;
  3. 阅读结果的元素[1];
  4. 这似乎对我来说是最符合逻辑的。此处不需要regex,因为它比简单的explode操作更慢。

    以下是一个例子:

    $handle = fopen( 'file.txt', 'r' );
    if ( $handle ) {
        while ( ( $line = fgets( $handle ) ) !== false ) {
            $matches = explode( ' ', $line );
            if ( $matches[4] == '124' )
                echo $matches[1] . '<br/>';
        }
    }
    

答案 3 :(得分:1)

"/^.*$pattern.*\$/m"更改为"/$pattern\d*/i"

然后echo implode($matches[0]);改为foreach($matches[0] as $item) echo "$item<br />\r\n";

答案 4 :(得分:0)

试试这个:

--->\s\d{5}

正则表达式在这里有点过分,一个简单的explode('--->', $str)并选择第一个元素就足够了

答案 5 :(得分:0)

$file = file_get_contents('file.txt');
$lines = explode('---> ', $file);
for($i=1; $i<count($lines); $i=$i+3)
if(strpos($lines[$i], '124')!==false)
    $col[$i/3] = /*'--> ' . */$lines[$i];
print_r($col);

这似乎工作得很好。如果您想要 - &gt;取消注释以上评论包含在输出中。此外,生成的$ col数组将使用找到的行号进行索引。如果你不想要,只需用[]替换[$ i / 3]。

进一步说明:

function SearchFileByColumn($contents, $col_num, $search, $col_count = 3) {
    $segs = explode('---> ', $contents);
    for($i=$col_num; $i<count($segs); $i=$i+$col_count)
        if(strpos($segs[$i], $search) !== false)
            $res[] = $segs[$i];
    return $res;
}

$results = SearchFileByColumn($contents, 1, '124');