【问题标题】:PHP How to show search results like search engine [closed]PHP如何像搜索引擎一样显示搜索结果[关闭]
【发布时间】:2014-07-26 15:15:27
【问题描述】:

我的网站中有一个搜索页面。
我不想在结果中显示整个句子,我想以“Google 风格”显示:
前 5 个字符,突出显示的搜索字词,后 5 个字符...
以此类推,对于句子中找到的每个单词。

$teksto="bla1 bla2 bla3 bla4 bla5 Bingo bla6 bla7 bla8 bla9 bla10 Bingo bla11 bla12 Bingo bla13 bla14 bla15";
$serchu="bingo";
$teksto=preg_replace("/[\s]{1,}/is",' ',$teksto); // (form multispaces, breaklines, etc. to just 1 space)
echo preg_replace("/(.{0,5})($serchu)(.{0,5})/is"," ...$1<b>$2</b>$3... &nbsp;&nbsp;",$texto);

结果是:
bla1 bla2 bla3 bla4 ...bla5 宾果游戏 bla6... bla7 bla8 bla9 b ...la10 宾果游戏 bla1... 1 b ...la12 宾果游戏 bla1... 3 bla14 bla15

我希望结果可能是:
...bla5 宾果游戏 bla6... ...la10 宾果游戏 bla1... ...la12 宾果游戏 bla1...

换句话说,我不希望其他词出现在开头或结尾。
MySQL 解决方案也值得赞赏。

【问题讨论】:

  • 问题是你用一个点来表示一个词。点代表单个字符。实际上,您的模式的结果是 5 个前面的字符、突出显示的关键字和后面的 5 个字符。您需要对关键字前后的词进行更好的描述。

标签: php mysql regex search replace


【解决方案1】:

不要替换东西,而是尝试只匹配匹配的单词并在其周围打印一些上下文。这会搜索所有出现的 $serchu,前后各有 5 个字符,并将结果与​​“...”放在一起:

preg_match_all("/.....$serchu...../i", $teksto, $matches);
echo implode('...', $matches[0]);

结果:

 bla5 Bingo bla6...la10 Bingo bla1...la12 Bingo bla1

$serchu 只是在字符串的开头或结尾时,这不起作用,但我认为修复这种方法比使用preg_replace 更成功。

【讨论】:

  • 为什么不用.{0,5} 而不是.....?使其更具可读性/可维护性:)
  • 我认为 OP 想要五个“单词”而不是五个字符。
  • @Casimir nono:五个字符(使问题更具可读性)。在实践中我会使用更多一点。 (顺便说一句,分词似乎是个好建议!)
  • 非常感谢!它工作得很好! 使用 .{0,5} 子句,我还可以显示 $teksto 是否在句首 preg_match_all("/.{0,5}$q.{0,5}/is",$teksto,$matches); echo preg_replace("/($serchu)/is"," &lt;b&gt;$1&lt;/b&gt;",implode('... &amp;nbsp;', $matches[0]));
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多