$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);
}
}
答案 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'的两次出现。