0

首先,我要感谢帮助我创建了一个非常好的搜索结果查询。希望各位朋友能帮我改进一下。

这是查询

$searchresult = $mysql->query("SELECT * FROM pages WHERE PageContent LIKE '%$searchTerm%'");

if($searchresult->num_rows > 0) {

    while (($row = $searchresult->fetch_assoc()) !== null)
    {
        echo '<h3>' . $row["PageTitle"] . '</h1>';

        $position = strpos($row["PageContent"], $search);
        $snippet = substr($row["PageContent"], $position - 200, $position + 200);

        echo $snippet . '<hr><br />';  
    }

} else {
     echo "<p>Sorry, but we can not find an entry to match your query</p><br><br>"; 
}

我喜欢做的是以不破坏任何单词的方式修剪片段,以便句子可读......并且如果可能的话,使搜索词以粗体显示。亲爱的朋友们,我需要你的帮助。谢谢大家。

4

1 回答 1

0

有很大的改进空间,但这里有一个方法:

<?php

echo trimsnippet("Some really, really, really reaaally long text I don't really care about, at all.", "text", 30) . "\n";


function trimsnippet($text, $query, $max_length){
  $position = strpos($text, $query); 
  $snippet = substr($text, max($position - $max_length - 1, 0), strlen($query) + $max_length*2 + 1);
  echo "<$snippet>\n";
  preg_match("/[^\w](?P<pre>.*)".$query."(?P<post>.*)[^\w]/", $snippet, $extracted); 
  return $extracted["pre"]."<strong>".$query."</strong>".$extracted["post"];
}

输出:

真的,真的很长的文字,我真的不在乎,

如何使用它:

忽略第一行(echo ...),这只是一个演示。将函数放在使用它的 php 中的任何位置,然后替换您的行:

    $position = strpos($row["PageContent"], $search);
    $snippet = substr($row["PageContent"], $position - 200, $position + 200)

和:

    $snippet = trimsnippet($row["PageContent"], $search, 200);

您可以对此功能进行一些改进:

  • 检查 $query 是否真的出现在 $text
  • 在结果的开头或结尾添加省略号 (...)
  • 控制当 $query 接近开头和结尾时会发生什么(并避免在这种情况下添加省略号)
  • 清理 $query (可能还有 $text ),使其不能包含可能与您的正则表达式模式混淆的“正则表达式语法”。
于 2013-02-14T02:30:51.920 回答