解析和格式化搜索结果

时间:2009-02-26 21:43:51

标签: language-agnostic parsing formatting search-engine code-golf

  

搜索:

     

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

     

结果:

     

... 脚本语言最初......生成动态网页。它具有......图形应用程序 ....目的脚本语言,即创建网页作为输出... < / p>

假设我想要一个值,表示在匹配项的任一侧允许填充的字符数量,另一个值表示结果中将显示多少匹配(即,我只希望看到第一个5场比赛,仅此而已。)

究竟会怎么做呢?

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

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

重要:

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

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

额外信用:

获取padding-variable以选择填充单词,而不是字符。

2 个答案:

答案 0 :(得分:1)

我的思考过程:

  1. 创建一个支持非唯一名称/值对的结果数组(PHP在其标准array对象中支持此功能)
  2. 遍历每个搜索词并在搜索文本中找到其字符起始位置
  3. 将一个项目添加到结果数组中,该数组存储它刚刚找到的字符位置,并将实际搜索词作为键
  4. 当您找到所有搜索字词后,按值按升序排列数组(搜索字词的字符位置)
  5. 现在,搜索结果将按照在搜索文本
  6. 中找到的顺序排列
  7. 循环遍历结果数组并使用指定的单词填充在搜索词的每一侧获取单词,同时还在单独的名称/值对中跟踪单词计数
  8. 伪代码,或者我最好的尝试:

    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
    }
    

答案 1 :(得分:-1)

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

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

由于你需要一个非语言相关的解决方案,我不会在这里放置实际的表达式,因为确切的语法因语言而异。