PHP 来自 mySql 邻近搜索的字符串突出显示

PHP string highlight from mySql proximity search

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

示例 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 中应用相同的正则表达式即可。例如:

<?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>[=10=]</b>', $str);

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

注意,您需要将正则表达式括在一些符号对中(如上例中的 /.../)。最后还有修饰符。 i 允许执行 case-insensitive 匹配,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>') ...

我假设您会在 HTML 端显示粗体,这样您就不必 运行 数据库端的正则表达式,您可以在 PHP:

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

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

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