如何优化正则表达式以精准提取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
相关产品推荐
相关产品推荐

