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

如何优化正则表达式以精准提取Blade文件中的多语言字符串

Blade多语言字符串解析正则优化方案

现有正则核心问题

  • 捕获组使用通用非贪婪匹配(.+?),无法处理翻译字符串内含转义引号的场景(比如{{ __('it\'s a demo') }}),会被转义后的引号打断捕获
  • 前后缀的(?:.+?)?没有边界限制,可能跨多个{{}}结构匹配,导致误抓
  • 未严格对应单/双引号的闭合规则,单引号开头、双引号闭合的非法语法也会被错误匹配

优化后的正则方案

带注释调试版(加了x修饰符可直接运行)

/{{                          # 匹配Blade模板标准输出左标记
    \s*                       # 匹配任意数量前导空格
    (?:[^}]*?)?               # 前缀匹配:仅匹配不含右大括号的字符,避免跨标签越界
    (?:__|trans|@lang)        # 兼容Laravel生态常用翻译函数
    \(                        # 匹配函数左括号
    \s*                       # 括号内前导空格
    (?:
        '                     # 单引号场景
        (?<key>(?:\\'|[^'])*) # 捕获翻译key:允许转义单引号,其他字符排除单引号
        '                     # 单引号闭合
        |
        "                     # 双引号场景
        (?<key>(?:\\"|[^"])*) # 捕获翻译key:允许转义双引号,其他字符排除双引号
        "
    )
    \s*                       # 引号后任意空格
    (?:,|\))                  # 匹配函数结束右括号,或参数分隔逗号(兼容带参数的翻译调用)
    (?:[^}]*?)?               # 后缀匹配:仅匹配不含右大括号的字符
    \s*                       # 尾部任意空格
}}/xsu                        # 修饰符:x忽略正则内空格注释 s允许.匹配换行 u支持Unicode多语言字符

压缩可直接调用版

/{{\s*(?:[^}]*?)?(?:__|trans|@lang)\(\s*(?:'((?:\\'|[^'])*)'|"((?:\\"|[^"])*)")\s*(?:,|\))(?:[^}]*?)?\s*}}/su

使用说明

  • 无命名分组的压缩版捕获结果取分组1(单引号场景)或分组2(双引号场景)即可
  • 捕获到key后需要做转义还原:把\'替换为'、\"替换为"再写入语言文件
  • 若需要兼容{!! !!}格式的未转义输出场景,把正则开头的{{替换为{{|{!!},结尾的}}替换为}}|!!}即可

内容的提问来源于stack exchange,提问作者Jesse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:45:00