我希望使用给定的关键字突出显示给定字符串中的文本,并添加随机数量的周围单词。
例句:
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}
和
([a-zA-Z,. ]+){1,3} ".$n." ([a-zA-Z,. ]+){1,3}
任何想法如何改进并使其更加健壮?
答案 0 :(得分:4)
用于突出显示使用preg_replace功能。这是一个想法:$s = "dolore magna";
$str = preg_replace(
'/\b(?>[\'\w-]+\W+){0,4}'.preg_quote($s, "/").'(?:\W+[\'\w-]+){0,4}/i',
'<b>$0</b>', $str);
测试pattern at regex101或php test at eval.in。 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
flag进行无壳匹配 - 如果不需要则删除。第一组?>
atomic用于表现。
['\w-]
(\w
shorthand作为单词字符,'
和-
)\W
匹配一个不是单词字符的字符(否定\w
)\b
与word boundary匹配。用它来获得更好的性能。答案 1 :(得分:2)
我认为这将完成你所追求的目标。请参阅演示,了解正则表达式所做的一切,或者如果您有疑问,请发表评论。
正则表达式:
((?:[\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);
请注意,捕获的值将位于$matches[1]
和$matches[2]
。