如何在PHP中搜索文件?

时间:2018-01-25 19:30:02

标签: php filesystems glob

我有一个用户提交搜索词的表单,我的脚本将在MySQL数据库中找到匹配的文档名称。我们现在想要摆脱数据库并仅使用该应用程序的文件系统。

我想在PHP中实现一个类似于' LIKE'的搜索功能。 MySQL中的运算符。我对glob很熟悉并且之前已经对此进行了搜索,但到目前为止还没有找到正则表达式,它会给我一个与使用“LIKE”相同或相似的结果。

例如:

$search_term = $_POST['search_term'];

$search_results = glob('[uploads/[flags used for search term]]');
foreach($search_results as $result){
?>

<a target='_blank' href="<?php echo $result; ?>">
    <?php echo $result; ?>
</a>

<?php
}

修改

我刚刚意识到我可以使用rsync同步文件并稍后运行一个任务,它将递归新复制的文件以获取插入数据库的文件名(而不是从原始源复制和清理字符串)。

3 个答案:

答案 0 :(得分:2)

基本正则表达式是(样本字符串“我的狗是约克夏犬”):

(.*)yorkshire(.*)

在PHP中,这看起来像:

$pattern = '/(.*)'. $search_term . '(.*)/';

(.*)在零和无限次之间匹配任何字符(行终止符除外),尽可能多次,根据需要返回

如JBD在评论中所述,glob()不支持正则表达式,因此您必须构建一个名称列表(数组)以与正则表达式进行检查。正如我最初在评论中所述,用glob()替换数据库查找在许多层面上是一个坏主意。

答案 1 :(得分:1)

此解决方案没有优势,如果您尝试实施搜索灵活搜索,则glob非常有限,但是,您可以尝试使用DirectoryItterator在目录/文件中进行搜索。

我仍然不建议你这样做。你可以做的是使文件具有目录结构,使用字符串比使用文件系统快得多,并且比数据库更少依赖。

答案 2 :(得分:1)

这通常不是一个好主意。文件系统的速度不如索引数据库快。此外,传递任意用户输入的简单方法将允许黑客爬过整个服务器(例如glob('../../*')),并可能泄露可能用于进一步危害系统的信息。

可以只选择你想要搜索的所有文件(glob('*')),然后将正则表达式应用于该数组。当然,允许您的用户发送任意正则表达式compromise your server

我认为您最好使用原始数据库方法。您应该修复这些问题(以及您在评论中指出的其他问题),而不是使您的文件系统可搜索。