我有一个用户提交搜索词的表单,我的脚本将在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同步文件并稍后运行一个任务,它将递归新复制的文件以获取插入数据库的文件名(而不是从原始源复制和清理字符串)。
答案 0 :(得分:2)
基本正则表达式是(样本字符串“我的狗是约克夏犬”):
(.*)yorkshire(.*)
在PHP中,这看起来像:
$pattern = '/(.*)'. $search_term . '(.*)/';
(.*)
在零和无限次之间匹配任何字符(行终止符除外),尽可能多次,根据需要返回
如JBD在评论中所述,glob()
不支持正则表达式,因此您必须构建一个名称列表(数组)以与正则表达式进行检查。正如我最初在评论中所述,用glob()
替换数据库查找在许多层面上是一个坏主意。
答案 1 :(得分:1)
此解决方案没有优势,如果您尝试实施搜索灵活搜索,则glob非常有限,但是,您可以尝试使用DirectoryItterator在目录/文件中进行搜索。
我仍然不建议你这样做。你可以做的是使文件具有目录结构,使用字符串比使用文件系统快得多,并且比数据库更少依赖。
答案 2 :(得分:1)
这通常不是一个好主意。文件系统的速度不如索引数据库快。此外,传递任意用户输入的简单方法将允许黑客爬过整个服务器(例如glob('../../*')
),并可能泄露可能用于进一步危害系统的信息。
你可以只选择你想要搜索的所有文件(glob('*')
),然后将正则表达式应用于该数组。当然,允许您的用户发送任意正则表达式compromise your server。
我认为您最好使用原始数据库方法。您应该修复这些问题(以及您在评论中指出的其他问题),而不是使您的文件系统可搜索。