我需要加粗搜索词及其上下文(在句子中).
考虑字符串:
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)
但是,如何在不重叠到下一个或上一个句子之前和之后包含两个单词?
您可以将字符串拆分为"句子"(完整分割(感叹号,问号等等)).
然后用匹配的单词找到句子.
然后将该句子拆分为"单词",并在匹配单词之前和之后的两个单词中添加一些标签.由于您只有一个句子要处理,因此您需要检查以确保不会超出单词数组的范围.
然后将这些单词重新加入,并将所有句子重新加入.
或者,你可以使用正则表达式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\-&,]+"空格"," - ","&",",",在单词之间允许 - 添加更多您喜欢的内容,但不要将"."放入防止粗体超过完全停止).