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

时间:2021-04-23 09:58:52

标签: php regex visual-studio-code code-snippets regexp-replace

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

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

  • /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 代码段变量 $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;

有人能帮忙解决吗?

非常感谢!!!

2 个答案:

答案 0 :(得分:2)

你可以使用

"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 组:除 /\ 之外的任何零个或多个字符
  • [\/\\]?- 可选的 //\ 字符
  • | - 或
  • [\/\\] - \/ 字符
  • ([^\/\\]*) - 第 2 组:除 /\ 之外的任何零个或多个字符

演示:

enter image description here

答案 1 :(得分:1)

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

另一种方法是不匹配 group/alternative 1 中的结束分隔符

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

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

相关问题