如何在字符串中的字符串周围加粗两个单词,但不重叠句子?

Rya*_*yan 1 php string text

我需要加粗搜索词及其上下文(在句子中).

考虑字符串:

Lorem ipsum dolor坐着.Consectetuer adipiscing elit.

如果搜索词为Lorem ipsum,则结果应为:

Lorem ipsum dolor坐着.Consectetuer adipiscing elit.

如果是搜索dolor sit,结果应该是:

Lorem ipsum dolor坐着.Consectetuer adipiscing elit.

如果是搜索Consectetuer,结果应该是:

Lorem ipsum dolor坐着.Consectetuer adipiscing elit.

你怎么推荐我这样做(在PHP中)?

粗略搜索术语很容易:

$string = str_replace($query,'<strong>' . $query . '</strong>', $string);
Run Code Online (Sandbox Code Playgroud)

但是,如何在不重叠到下一个或上一个句子之前和之后包含两个单词?

mat*_*fee 5

您可以将字符串拆分为"句子"(完整分割(感叹号,问号等等)).

然后用匹配的单词找到句子.

然后将该句子拆分为"单词",并在匹配单词之前和之后的两个单词中添加一些标签.由于您只有一个句子要处理,因此您需要检查以确保不会超出单词数组的范围.

然后将这些单词重新加入,并将所有句子重新加入.


或者,你可以使用正则表达式preg_replace(虽然这可能不是你想要的道路,特别是如果你有一个选项,如在明文上拆分 - 有一个引用类似"你有问题,你想使用正则表达式.现在你有两个问题."):

$string = preg_replace("/\\b(\\w+ +){0,2}$query( +\\w+){0,2}\\b/i",
                       '<strong>$0</strong>',
                       $string);
Run Code Online (Sandbox Code Playgroud)

正则表达式就像这样(反斜杠在上面转义):

\b        | match a word boundary (ie match whole words)
(\w+ +)   | match a "word" followed by spaces (to separate it from the next word)
{0,2}     | match 0 to 2 of these such words (it will match as many as possible
          | up to 2)
$query    | match the '$query' string
( +\w+)   | regex for space (separating $query) followed by a word
{0,2}     | match 0 to 2 of these words (as many as possible up to 2)
\b        | match a word boundary (ie match whole words)
Run Code Online (Sandbox Code Playgroud)

所述/i在端部的意思是"不区分大小写".

替换字符串<strong>$0</strong>表示替换为"强"标记所包围的所有匹配字.

这样做的原因是正则表达式不允许匹配句号.所以它最多可以抓取2个单词,$query但是不允许超过完全停止.

有通常的警告(你使用任何方法都会有) - 你想让粗体结束问号吗?感叹号?撇号是否允许一个字?对于单词之间的非句点标点符号,您会怎么做?等等

我建议改进上面的正则表达式(如果你想使用正则表达式):

  • 允许使用单词中的撇号:更改\w+[\w']+(转义为PHP反斜杠)
  • 允许单词之间使用各种标点符号:将单词更改为(+类似于[\s\-&,]+"空格"," - ","&",",",在单词之间允许 - 添加更多您喜欢的内容,但不要将"."放入防止粗体超过完全停止).