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 .
号
我试过什么?
有什么办法可以改进这个并使它更强大吗?
用于突出显示使用preg_replace函数。这里有一个想法:
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。 ;
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed.
号
使用
- 作为字符,我使用了
['\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
注:捕获值将在