您可以将字符串拆分为“句子”(以句号拆分(感叹号、问号……怎么样))。
然后找到与该单词匹配的句子。
然后将该句子拆分为“单词”,并在匹配单词的前后两个单词中添加一些标签。由于您只有一个句子需要处理,因此您需要进行一项检查以确保您没有超出单词数组的范围。
然后将单词重新连接在一起,并将所有句子重新连接在一起。
或者,您可以使用正则表达式和preg_replace(尽管这可能不是您想要走的路,特别是如果您有一个选项,例如在纯文本上进行拆分 - 有一句话类似于“您遇到问题,并且您想使用正则表达式来解决它。现在您有了两个问题。”):
$string = preg_replace("/\\b(\\w+ +){0,2}$query( +\\w+){0,2}\\b/i",
'<strong>$0</strong>',
$string);
正则表达式的工作方式如下(上面转义了反斜杠):
\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)
The /i
最后的意思是“不区分大小写”。
替换字符串,<strong>$0</strong>
, 表示替换为“strong”标签包围的所有匹配单词。
这有效的原因是正则表达式不允许匹配句号。所以它会抢up to两边各2个字$query
但禁止越过句号。
有一些常见的警告(无论您使用什么方法都会有这些警告)——您是否希望用粗体来表示问号?感叹号?单词中允许使用撇号吗?对于单词之间的非句号标点符号,您会采取什么措施? ETC。
我建议将上述正则表达式(如果您想使用正则表达式)细化为:
- 允许在单词中使用撇号:change
\w+
to [\w']+
(也转义 PHP 反斜杠)
- 允许使用各种标点符号between词语: 改变
+
类似的东西[\s\-&,]+
(表示单词之间允许使用“空格”、“-”、“&”、“,”——根据您的喜好添加更多内容,但不要放入“.”,以防止粗体超过句号) 。