提问者:小点点

突出显示带有周围单词的文本


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

例句:

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

示例关键字:

多洛雷麦格纳

期望结果:(关键字前后标记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}and([a-zA-Z,. ] ){1,3}".$n."([a-zA-Z,. ] ){1,3}

有什么想法可以改进它并使其更加健壮吗?


共2个答案

匿名用户

要突出显示,请使用preg_replace函数。这里有一个想法:

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

在regex101测试模式或在eval.in进行php测试。

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匹配单词边界。用它来获得更好的性能。

匿名用户

我认为这将完成您所追求的。请参阅演示以了解正则表达式所做的一切,或者如果您有问题,请发表评论。

正则表达式:

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

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

PHP:

<?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

请注意,捕获的值将位于$匹配[1]$匹配[2]中。