关于php:用周围的单词突出显示文本

highlight text with surrounding words

我想用给定的关键字突出显示给定字符串中的文本,并添加随机数目的周围单词。

例句:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed.

示例关键字:

dolore magna

预期结果:(在关键字前后标记0-4个单词

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et **dolore magna** aliquyam erat, sed.

我试过什么?

( [\w,\.-\?]+){0,5}".$myKeyword." (.+ ){2,5}。和江户十一〔一〕号

有什么办法可以改进这个并使它更强大吗?


用于突出显示使用preg_replace函数。这里有一个想法:$s ="dolore magna";

1
2
3
$str = preg_replace(
       '/\b(?>[\'\w-]+\W+){0,4}'.preg_quote($s,"/").'(?:\W+[\'\w-]+){0,4}/i',
       '$0', $str);

在regex101测试模式,或者在eval.in测试php。 ;echo $str;

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed.

使用i标志进行无案例匹配-如果不需要,可以删除。第一组?>原子性能。

  • 作为字符,我使用了['\w-](\w作为字符的简写,'-)
  • \w匹配的字符不是字字符(否定的\w)
  • \b匹配单词边界。使用它以获得更好的性能。


我想这会实现你想要的。请参阅演示以了解regex所做的一切的解释,或者在有问题时发表评论。

Regex:

1
((?:[\w,.\-?]+\h){0,5})\b' . . '\b((?:.+\h){2,5})

演示:https://regex101.com/r/vg8qt2/1

PHP:

1
2
3
4
5
6
7
<?php
$string = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed.';
$term = 'dolore magna';
$min = 0;
$max = 5;
preg_match('~((?:[\w,.\-?]+\h){'.$min.','.$max. '})\b' . preg_quote($term) . '\b((?:.+\h){'.$min.','.$max.'})~', $string, $matches);
print_r($matches);

演示:https://eval.in/410063

注:捕获值将在$matches[1]$matches[2]中。