Php 搜索带有权重的文件名

Php 搜索带有权重的文件名,php,Php,我有成千上万的文件。 我希望用户能够键入一些单词,因此他应该得到一个文件列表,根据给定单词的权重排序。 字符串中的位置本身是不相关的。重要的是给定单词之间的距离。单词分开得越远,结果就越不重要。部分匹配并不重要,应该显示在列表的底部 例如: 搜索字符串:“foo-bar” 预期结果(粗体字符仅用于可见性) foobar.txt foobar其他长字符串.txt foo2barother long string.txt 测试foobarother long string.txt test tes

我有成千上万的文件。 我希望用户能够键入一些单词,因此他应该得到一个文件列表,根据给定单词的权重排序。 字符串中的位置本身是不相关的。重要的是给定单词之间的距离。单词分开得越远,结果就越不重要。部分匹配并不重要,应该显示在列表的底部

例如:

搜索字符串:“foo-bar”

预期结果(粗体字符仅用于可见性)

  • foobar.txt
  • foobar其他长字符串.txt
  • foo2barother long string.txt
  • 测试foobarother long string.txt
  • test testfooqweqwebarother long string.txt
  • fooqweqwe.txt
  • qweqwe.txt
我知道levenshtein(),但文件名越长,精确度就越低。与类似的函数相同

例如:我正在搜索“DIN 107”

使用“相似的文本()”,我得到:

  • “DIN 107[1974-04].pdf'-50%
  • “DIN 4107[1978-01].pdf'-48.3%
  • “DIN V 18035-6.pdf”-也是50%
但我希望用户看到上面排序的列表

实现这一目标的好方法是什么?

以下是一种方法:

<?php

$a = [
   'bar qweqwe.txt',
   'foo bar other long string.txt',
   'foo bar.txt',
   'foo qweqwe.txt',
   'foo2 bar other long string.txt',
   'test foo bar other long string.txt',
   'test test foo qweqwe bar other long string.txt'
];

function f($s) {
   $n = strpos($s, 'foo');
   if ($n === false) {
      return false;
   }
   $n2 = strpos($s, 'bar');
   if ($n2 === false) {
      return false;
   }
   return abs($n2 - $n);
}

function f2($s, $s2) {
   $n = f($s);
   if ($n === false) {
      return 1;
   }
   $n2 = f($s2);
   if ($n2 === false) {
      return -1;
   }
   return $n <=> $n2;
}

usort($a, 'f2');

foreach ($a as $s) {
   echo $s, "\n";
}

您必须首先明确您的搜索条件。是否希望搜索词在文件名中的位置有所不同?看起来是这样,但我怀疑这是个好主意。部分匹配呢?我们不能为你编造这些东西。是的,你是对的。。我编辑了我的问题。这是一次勇敢的尝试,但我相信“foo-bar”只是一个测试字符串。它可能也适用于“炎热的夏夜”和“巧克力”。也许在你的回答中报告输出是个好主意?@KIKOSoftware我的回答只是一个开始。我同意,OP应该走自己的路。这个问题很模糊,所以你的回答和预期的一样好。