php如何搜索目录中的文件以进行精确的行匹配?

时间:2010-09-20 23:00:00

标签: php search

$allfiles = glob($searchdir."*.txt");
$elist = array();
foreach($allfiles as $file){
    $lines = array_merge($elist, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
}
foreach ($lines as $existing){
    // this echos a number // echo "<br />Existing".$existing."<br />";
    if (preg_match("/\b".$searchforthis."\b/i", $existing)) {
        echo "A match was found.";
        continue;
    } else {
        echo "A match was not found.";
        $nodupe ="y";
        continue;
    }
}

在上面我试图检查文件目录中的匹配,并为下一步返回true或false。

显然不起作用。我在尝试进行故障排除时回应了这一行但是,我得到了一个数字,而不是该行上的字。

正在搜索的文件单列,每行只有100行。目录中最多可能有5个。

我回应了路径和其他变量,一切都是正确的。从来没有找到匹配。

我知道我应该学习mysql但是,我需要这个才能工作。

我也不确定继续或休息。此例程驻留在if。

中的for循环中

我希望在发现匹配时停止查看。

感谢任何指导。

我在这里添加了文件写入部分,以防我搞砸了导致问题。它会向文件写入一个数字,即使我绕过下面的append开关也不会追加,并且将该语句置为null。

/****Write the entry if no match******/
if ($nodupe != "y"){
    if($append == "n"){
        $name .= $searchforthis."\n";
        file_put_contents($filepath.$writefile.".txt", $name, LOCK_EX);
    }
    else{
        file_put_contents($filepath.$writefile.".txt", $name, FILE_APPEND | LOCK_EX);
    } 
}     

2 个答案:

答案 0 :(得分:1)

/ m修饰符将跨行搜索,因此您无需单独扫描每一行:

$search = 'whatever';
foreach (glob($dir . '/*.txt') as $file) {
    if (preg_match('/^' . $search . '$/m', file_get_contents($file))) {
        echo "$file contains $search\n";
        break;
    } else {
        echo "$file does not contain $search\n";
    }
}

或者,如果您的单词列表没有太大变化,那么最好将它们放入PHP数组中并将它们直接包含在脚本中:

$list = array(
    'word1',
    'word2',
    'word3',
    // ...
);

然后你可以使用in_array()来扫描单词。

答案 1 :(得分:1)

试试这个:

<?php

# variables

$sDir = __DIR__; # php 5.3, for php <5.3 use dirname(__FILE__);
$sFilePattern = '*.php';
$sSearch = 'printf';

# config

$sRegExp = '/\b'.$sSearch.'\b/i';

# code

foreach (glob($sDir . DIRECTORY_SEPARATOR . $sFilePattern) as $sFile){

    foreach (file($sFile) as $nLineNumber => $sLine){

        if (preg_match($sRegExp, $sLine) == 1){

            printf('<br/>Word "%s" found in %s, line %d', $sSearch, $sFile, $nLineNumber);

        } // if

    } // foreach

} // foreach

这与你的完全相同。应该显示'printf'的两次出现。