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 に答える