首页 > 解决方案 > 从刀片文件中自动解析语言字符串

问题描述

我想从刀片文件 ( {{ __('some phrase') }}) 中解析出语言字符串并将它们自动存储在语言文件中。我确实尝试了一个与此相关的插件,它工作正常,但不允许运行函数。我创建了以下正则表达式。

{                              // Opening curly brace
    (?:\s+?)?                  // Optional spacing
    {                          // Opening curly brace
        (?:\s+?)?              // Optional spacing
        (?:.+?)?               // Optional function
            __\(               // Begin translation function
                (?:\s+?)?      // Optional spacing
                    (?:'|\")   // Single or double quote

                        (.+?)  // Actual string to capture

                    (?:'|\")   // Single or double quote
                (?:\s+?)?      // Optional spacing
            (?:\)|,)           // End translation function, basically
        (?:.+?)?               // Ending optional function
        (?:\s+?)?              // Optional spacing
    }                          // Ending curly brace
    (?:\s+?)?                  // Optional spacing
}                              // Ending curly brace
"/{(?:\s+?)?{(?:\s+?)?(?:.+?)?__\((?:\s+?)?(?:'|\")(.+?)(?:'|\")(?:\s+?)?(?:\)|,)(?:.+?)?(?:\s+?)?}(?:\s+?)?}/"

我知道这并不完美,我怎样才能进一步改进它以更好地捕捉一些边缘情况,例如一些结束字符串打破了中间的捕获?

标签: phpregexlaravel

解决方案


我最近使用这个 github repo作为基础做了这样的事情:

我在这里唯一需要的是实际的解析正则表达式和逻辑,可以在这个文件中找到

为简单起见,他们所做的是解析并匹配用于显示已翻译字符串的实际可能函数:__, _t, @lang. 通过这样做,它不再需要搜索和匹配花括号,因为如果您正在使用这可能会很痛苦:

  1. 过滤器:{{ __('whatever') | ucfirst }}
  2. 条件渲染:{{ $title ?? __('Whatever') }}

还有许多其他情况会让你的正则表达式发疯。

通过仅匹配函数,模式非常简单:

/(__|_t|@lang)\(\h*[\'"](.+)[\'"]\h*[\),]/U

这是一个 Regex101 示例,展示了您正在寻找的案例


推荐阅读