3

搜索:

脚本+语言 Web+页面应用程序

结果:

...脚本语言最初...产生动态网页。它具有...图形应用程序...目的脚本语言是...d 创建网页作为输出...

假设我想要一个值来表示允许在匹配项的任一侧填充的字符数量,另一个值表示结果中将显示多少匹配项(即,我只想查看前 5 个匹配项,而已)。

会怎么做呢?

这与语言无关,但我将在 PHP 环境中实现该解决方案,因此请将答案限制在不需要特定语言或框架的选项上。

这是我的思考过程:从搜索词创建一个数组。确定哪个搜索词具有关于它在文章正文中的位置的最低索引。将正文的那部分收集到另一个变量中,然后从文章正文中删除该部分。返回到第 1 步。您甚至可以为每个单词添加一个计数器,当计数器达到 3 左右时跳过它。

重要的:

解决方案必须以非线性方式匹配所有搜索项。意思是,如果术语一存在于术语二之后,则它应该在术语二之后找到。同样,它也应该在第 3 学期之后找到。如果恰好在它们之前存在,则应在术语 1 和 2 之前找到术语 3。

该解决方案应允许我声明“每个术语最多允许三个匹配项,然后终止摘要。”

额外学分:

获取填充变量以可选地填充单词,而不是字符。

4

2 回答 2

1

我的思考过程:

  1. 创建一个支持非唯一名称/值对的结果数组(PHP 在其标准array对象中支持这一点)
  2. 循环遍历每个搜索词并在搜索文本中找到其字符起始位置
  3. 将一个项目添加到结果数组中,以存储它刚刚找到的这个字符位置,并以实际搜索词作为键
  4. 找到所有搜索词后,按值升序对数组进行排序(搜索词的字符位置)
  5. 现在,搜索结果将按照在搜索文本中找到的顺序排列
  6. 遍历结果数组并使用指定的单词填充来获取搜索词每一侧的单词,同时还跟踪单独的名称/值对中的单词计数

伪代码,或者我最好的尝试:

function string GetSearchExcerpt(searchText, searchTerms, wordPadding = 0, searchLimit = 3)
{
  results = new array()
  startIndex = 0
  foreach (searchTerm in searchTerms) 
  {
    charIndex = searchText.FindByIndex(searchTerms, startIndex) // finds 1st position of searchTerm starting at startIndex
    results.Add(searchTerm, charIndex)
    startIndex = charIndex + 1
  }
  results = results.SortByValue()
  lastSearchTerm = ""
  searchTermCount = new array()
  outputText = ""
  foreach (searchTerm => charIndex in results)
  {
    searchTermCount[searchTerm]++
    if (searchTermCount[searchTerm] <= searchLimit)
    {
      // WordPadding is a simple function that moves left or right a given number of words starting at a specified character index and returns those words
      outputText += "..." + WordPadding(-wordPadding, charIndex) + "<strong>" + searchTerm + "</strong>" + WordPadding(wordPadding, charIndex)
    }
  }

  return outputText
}
于 2009-03-09T17:31:46.347 回答
-1

就我个人而言,我会将搜索词转换为正则表达式,然后使用 Regex Find-Replace 将匹配项包装在强标签中以进行格式化。

RegEx 路线很可能是您的最佳选择。因此,在您的示例中,您最终将获得三个单独的 RegEx 值。

由于您想要一个不依赖于语言的解决方案,因此我不会将实际表达式放在这里,因为确切的语法因语言而异。

于 2009-03-09T17:31:02.040 回答