【问题标题】:PHP string highlight from mySql proximity search来自 mySql 邻近搜索的 PHP 字符串突出显示
【发布时间】:2021-01-15 01:18:36
【问题描述】:

我想突出显示此查询找到的文本部分:

示例 1:

SELECT * FROM myTable WHERE columnA regexp 'work.{0,10}john.{0,10}smith'

亮点:“过去 5 年我一直为 John Joe Smith 工作

示例 2:

SELECT * FROM myTable WHERE columnA regexp 'jo.{0,10}ba.{0,10}tur'

亮点:“过去 5 年我一直为 Joseph Balsora Turgeon 工作”

我需要在字符串中找到高亮的起始位置,我可以找出结束没有问题。

即使经过一些研究,我也没有任何线索。

谢谢, 安迪

【问题讨论】:

  • 您能否提供有关您的数据的更多信息,例如您数据中的所有行都彼此相似?句型都一样吗?就像我为 工作了
  • 你能在你的代码中添加更多细节吗?还是你的php代码?以及使用括号突出显示的标识符(例如(My Hightlight))

标签: php sql string highlight


【解决方案1】:

我假设您将在 HTML 端显示粗体,因此您不必在 DB 端运行正则表达式,您可以在 PHP 上应用:

<?php
$string ="I have been working for John Joe Smith for the last <number> years";
$highlighted = preg_replace("/(working for .*)(for)/", '<b>\1</b> for', $string);

print $highlighted;
// I have been <b>working for John Joe Smith</b> for the last <number> years
?>

这个想法是找到并分组“为 * 工作”,然后将它们分成 2 组,分别为“为 * 工作”和“为”,然后只替换第一组。

【讨论】:

  • @Ibrahin Doğan:问题是当查询返回搜索结果时,我不知道«work.{0,10}john.{0,10}smith»的位置在哪里.在这种情况下,我不知道 «working for» 在 John 之前。
【解决方案2】:

只需在 php.ini 中应用相同的正则表达式。例如:

<?php 
  $str = "I have been working for John Joe Smith for the last 5 years";
  // Assuming you get the $str from the database

  $highlighted = preg_replace('/work.{0,10}john.{0,10}smith/iu', '<b>\0</b>', $str);

  print $highlighted;
  // I have been <b>working for John Joe Smith</b> for the last 5 years

注意,您需要将正则表达式括在一对符号中(如上例中的/.../)。最后还有修饰符。 i 允许执行不区分大小写的匹配,u 允许使用 Unicode 字符串/

UPD

也许你也可以直接在 MySQL 中执行相同的替换:

select REGEXP_REPLACE('I have been working for John Joe Smith for the last 5 years','work.{0,10}john.{0,10}smith','<b>\\0</b>') ...

【讨论】:

  • 如果姓氏不同怎么办?我认为“史密斯”这个词是动态的
  • @AterLux 好东西!正是我想要的。是的,该字符串来自数据库中的搜索结果,如上述查询中所述。搜索词来自 $_POST["searchWords"] (我知道注射,当一切正常时我会得到它)。第二个推荐好像需要先搜索结果才做搜索?我将在完整的数据库中进行测试,我担心它可能真的,我的意思是真的很慢!谢谢,你让我很开心......还有更多;o)
猜你喜欢
  • 2018-06-06
  • 2011-09-22
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2023-03-18
  • 2012-06-25
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多