You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade如何实现URL转锚点标签同时保留换行并防XSS?

问题根因
  • 执行顺序错误:原有代码先执行nl2br()生成<br>标签,再做URL正则匹配,正则规则中的\S*会将<br>的部分字符判定为URL的一部分,导致链接拼接异常
  • 正则规则局限性:原有域名后缀仅匹配2-3位,无法适配现在的多后缀域名(如.dev、.xyz等),同时URL边界判定逻辑缺失
修复后的完整代码
@php
// 正则优化:适配多长度域名后缀,URL边界排除特殊字符避免匹配到HTML实体和标签
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(\/[^\s<&]*)?/";
// 第一步先对原始用户输入做HTML转义,从根源避免XSS攻击,此时换行符仍为原生\n
$escapedText = e($message);
// 第二步替换URL为锚点标签,此时还未生成<br>标签,不会出现误匹配问题
$linkifiedText = preg_replace($reg_exUrl, '<a href="$0" target="_blank" rel="noopener noreferrer">$0</a>', $escapedText);
// 最后处理换行转换为<br>标签,不影响已生成的锚点结构
$finalText = nl2br($linkifiedText);
@endphp

<div class="message">
    {!! $finalText !!}
</div>

注:rel="noopener noreferrer"为可选安全优化项,用于防止新开页面通过window.opener篡改原页面,建议保留

需求符合验证
  • 自动转换URL为可点击锚点:所有合法URL都会被匹配替换,生成的锚点标签自带target="_blank"属性,点击会在新标签页打开
  • 保留用户输入换行:URL替换完成后才执行nl2br(),换行符会被正常转换为<br>标签展示,不会被拼接进URL地址
  • XSS防护:第一步就对原始用户输入调用e()做HTML转义,所有恶意脚本都会被转义为普通文本,不存在注入风险

内容的提问来源于stack exchange,提问作者Dark.Attacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:36:04