如何在字符串中为指定单词添加HTML <strong>标签(忽略大小写)
Laravel中匹配指定单词(兼容大小写)并添加标签的实现方案
实现思路
要兼容单词的大小写变体(如filho/Filho/FILHO)并保留原大小写,核心是用正则表达式的不区分大小写匹配(i修饰符)结合捕获组,将匹配到的原单词用<strong>标签包裹,同时注意Laravel视图中HTML标签的输出规则。
方案一:控制器中预处理数据(推荐)
在控制器中对查询结果的字段统一处理,避免视图中重复逻辑,提升效率:
控制器代码修改
public function palavras(Request $request, $palavra = null) { $getpalavra = palavras_br::where('slug', $palavra)->first(); $targetWord = $getpalavra->palavras; $versiculos = nvi::where('palavra', 'RLIKE','[[:<:]]'.$targetWord.'[[:>:]]') ->paginate(20) ->map(function ($item) use ($targetWord) { // 转义目标单词中的正则特殊字符,避免语法错误 $escapedWord = preg_quote($targetWord, '/'); // 匹配单词边界内的目标单词(不区分大小写),保留原内容包裹标签 $item->palavra = preg_replace("/\b($escapedWord)\b/i", '<strong>$1</strong>', $item->palavra); return $item; }); return view('palavra', compact(['versiculos','getpalavra'])); }
视图代码修改
由于需要输出HTML标签,必须使用{!! !!}而非默认的{{ }}(后者会转义HTML):
@foreach($versiculos as $v) <p>{!! $v->palavra !!}</p> @endforeach
方案二:视图中直接处理
如果仅需在视图中临时处理,可直接在循环内调用正则替换:
@foreach($versiculos as $v) <p>{!! preg_replace('/\b(' . preg_quote($getpalavra->palavras, '/') . ')\b/i', '<strong>$1</strong>', $v->palavra) !!}</p> @endforeach
关键细节说明
- 正则边界
\b:确保匹配独立单词,避免误匹配包含目标单词的其他词汇(如filhos不会被处理) preg_quote:转义目标单词中的正则特殊字符(如.、*等),防止正则表达式失效i修饰符:开启不区分大小写匹配,兼容所有大小写变体{!! !!}:Laravel中用于输出未转义的HTML内容,确保<strong>标签生效而非被转义为文本
内容的提问来源于stack exchange,提问作者Prinple Vrlo
相关产品推荐
相关产品推荐

