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

Posted

技术标签:

【中文标题】VSCODE 片段 PHP 自动填充命名空间【英文标题】:VSCODE snippet PHP to fill namespace automatically 【发布时间】:2021-07-17 12:55:45 【问题描述】:

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

考虑到我的所有类都位于MVC 文件夹内,并且它位于src 文件夹内,因此想法是在当前文档的目录上进行替换,示例:

/dev/project/src/MVC/Models/Access/Auth,或 /home/user/dev/project/src/MVC/Models/Access/Auth,或 /any_other_folder/src/MVC/Models/Access/Auth

我用 VSCODE sn-p variabe $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;

谁能帮忙解决一下?

非常感谢!!!

【问题讨论】:

【参考方案1】:

你可以使用

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

请参阅regex demo。

匹配

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

演示:

【讨论】:

试图理解:对于“/any_other_folder/src/MVC/Models/Access/SubFolderEnds-s-rc/Auth”,正则表达式在第 1 组中捕获了“MVC”,数组 ["Access", "SubFolderEnds-s-rc" , "Auth"] 在第 2 组中。“模型”未被捕获....这种替换如何工作“$1\\$2”,为什么它加入 group1 + 'Model'(未捕获)+ group2 .... 和也将 '/' 替换为 '\' 吗?非常感谢! @AllanAndrade Group 1 不匹配时,$1 为空,因此返回 \ + Group 2 值。由于Models 部分不匹配,因此不会被替换,并保留在结果字符串中。 @AllanAndrade 我忽略了最初的\,我刚刚添加了它。所以,使用"namespace \\\\$TM_DIRECTORY/(?:.*[\\/\\\\])?src[\\/\\\\]([^\\/\\\\]*)[\\/\\\\]?|[\\/\\\\]([^\\/\\\\]*)/$1\\$2/g", 维克托,再次感谢您!我用你上面的评论更新了它!【参考方案2】:

使用$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 目录后的目录名 |:分离备选方案 [/\\] : 目录分隔符 ([^/\\]+) : Group 2: 目录名

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

【讨论】:

以上是关于VSCODE 片段 PHP 自动填充命名空间的主要内容,如果未能解决你的问题,请参考以下文章

VSCode创建自定义代码段自动新建Vue实例

在 PHP 5.3 中使用命名空间自动加载?

PHP 类的命名空间 和自动载入

PHP——大话PHP设计模式——命名空间和类的自动载入

php使用命名空间时自动加载机制

php设计模式--命名空间与自动载入