Laravel 9 Blade生成含/、@的谷歌地图URL异常问题咨询
Laravel Blade生成Google Maps经纬度直达链接问题修复
需求说明
需要基于经纬度生成同时包含/和@两个符号的Google Maps直达链接,目标URL格式示例:
https://www.google.com/maps/search/33.93911000,67.70995300/@33.93911000,67.70995300,5z
现存问题
原编写的Blade代码如下:
<a href="https://www.google.com/maps/search/?api=1&query={{ $country->lat }},{{ $country->long }}/@{{ $country->lat }},{{ $country->long }},5z" target="_blank">
运行后出现三个异常:
- URL中的
/符号被自动转码为%2F @符号解析异常,输入单个@无法正常输出,需要输入@@才能输出单个@- 紧邻
@的Blade模板变量未被正常解析,直接以{{ $country->lat}}的源码形式输出到页面
实际错误输出示例:
https://www.google.com/maps/search/?api=1&query=33.93911000,67.70995300/@{{ $country->lat}},67.70995300,5z
问题原因
- Blade模板引擎将
@作为内置指令的起始标识符,当@符号和{{ }}变量输出语法紧邻时,引擎会将整段内容判定为自定义Blade指令,不会解析其中的变量表达式 - 原代码冗余拼接了
?api=1&query=查询参数,和目标URL的路径式格式不匹配,额外触发了URL编码逻辑 - 直接在HTML属性中混合拼接特殊字符和Blade语法,容易触发引擎的自动转义逻辑
修复方案
推荐写法:PHP块预组装URL(无解析冲突)
在模板中先用PHP代码块拼接完整URL,彻底避开Blade语法和@符号的解析冲突,不会触发特殊字符转义:
@php // 提前拼接完整地图链接,所有变量在纯PHP环境下解析 $mapUrl = sprintf( 'https://www.google.com/maps/search/%s,%s/@%s,%s,5z', $country->lat, $country->long, $country->lat, $country->long ); @endphp <a href="{{ $mapUrl }}" target="_blank">查看Google Maps位置</a>
极简写法:原生输出标签拆分拼接
如果不想单独写PHP块,可以使用Blade的原生无转义输出标签{!! !!},将@符号作为字符串拼接,不要让@和{{ }}语法直接相邻:
<a href="{!! 'https://www.google.com/maps/search/' . $country->lat . ',' . $country->long . '/@' . $country->lat . ',' . $country->long . ',5z' !!}" target="_blank">查看Google Maps位置</a>
注意:禁止将
{{ }}直接写在@@转义符后方,该写法会被Blade引擎识别为未定义指令,导致变量无法解析。
内容的提问来源于stack exchange,提问作者wruckie
相关产品推荐
相关产品推荐

