VSCODE 片段 PHP 自动填充命名空间

VSCODE snippet PHP to fill namespace automatically

我正在尝试创建一个 VSCODE CODE SNIPPET for PHP 自动放置命名空间(基于文件夹路径)。

考虑到我所有的 class 都位于 MVC 文件夹中,而这个位于 src 文件夹,示例:

我得到了带有 VSCODE 片段变量 $TM_DIRECTORY 的完整文件夹名称。

显然在 REGEX 上没有错误,如您所见:https://regex101.com/r/P8CpkX/1

我对截断代码的尝试:

"namep": {
        "prefix": [
            "namep"
        ],
        "body": [
            "",
            "// TM_DIRECTORY: $TM_DIRECTORY",

            "namespace ${TM_DIRECTORY/.*src\/(([^\/]*)(\/)?)|(\/)([^\/]*)/\/g};"
        ],
        "scope": "php",
        "description": "Try to put namespace automatically"
    }

结果是:

// TM_DIRECTORY: /home/user/dev/project/src/MVC/Models/Access/Auth
namespace ${TM_DIRECTORY/.*src/(([^/]*)(/)?)|(/)([^/]*)//g};

但预期是(如 REGEX 所示):

// TM_DIRECTORY: /home/user/dev/project/src/MVC/Models/Access/Auth
namespace \MVC\Models\Access\Auth;

谁能帮忙修一下?

非常感谢!!!

你可以使用

"namep": {
    "prefix": [
        "namep"
    ],
    "body": [
        "namespace \\${TM_DIRECTORY/(?:.*[\/\\])?src[\/\\]([^\/\\]*)[\/\\]?|[\/\\]([^\/\\]*)/\/g}",
    ],
    "scope": "php",
    "description": "Try to put namespace automatically"
}

参见regex demo

匹配

  • (?:.*[\/\])? - 尽可能多地出现除换行符以外的任何 0+ 个字符,然后是 \/
  • src[\/\] - src 字符串然后是 //\
  • ([^\/\]*) - 第 1 组:除 /\
  • 之外的任何零个或多个字符
  • [\/\]?- 一个可选的 //\ char
  • | - 或
  • [\/\] - 一个 \/ char
  • ([^\/\]*) - 第 2 组:除 /\
  • 之外的任何零个或多个字符

演示:

使用 $2 作为替换字符串会导致奇怪的匹配,Models 字符串永远不会匹配。

另一种方法是不匹配 group/alternative 1

中的结尾分隔符
  "namep": {
    "prefix": ["namep"],
    "body": ["namespace ${TM_DIRECTORY/.*[\/\\]src[\/\\]([^\/\\]+)|[\/\\]([^\/\\]+)/\/g}",],
    "scope": "php",
    "description": "Try to put namespace automatically"
  }
  • .*[/\]src[/\] : 搜索 src 作为目录名称
  • ([^/\]+):第1组:src目录
  • 后的目录名
  • | : 分离备选方案
  • [/\] : 目录分隔符
  • ([^/\]+) : 组 2: 一个目录名

您希望结果中的每个目录名称都以 \ 开头,并且第 1 组或第 2 组为空,因此我们可以使用替换字符串:$1