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

问题描述 投票:0回答:2

我正在尝试为 PHP 创建一个 VSCODE 代码片段,它会自动放置命名空间(基于文件夹路径)。

这个想法是对当前文档的目录进行替换,考虑到我的所有类都位于

MVC
文件夹内,并且它位于
src
文件夹内,示例:

  • /dev/project/src/MVC/Models/Access/Auth,或
  • /home/user/dev/project/src/MVC/Models/Access/Auth,或
  • /any_other_folder/src/MVC/模型/访问/身份验证

我通过 VSCODE 片段变量获得了完整的文件夹名称

$TM_DIRECTORY

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

我对截断代码的尝试:

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

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

其结果是:

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

但是预期的是(如REGEX所示):

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

谁能帮忙解决一下吗?

非常感谢!

php regex visual-studio-code code-snippets regexp-replace
2个回答
4
投票

你可以使用

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

请参阅 正则表达式演示

很匹配

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

演示:


1
投票

使用

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

另一种方法是不匹配组/替代 1 中的结束分隔符

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

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

\$1$2

© www.soinside.com 2019 - 2024. All rights reserved.