VSCODE 片段 PHP 自动填充命名空间
Posted
技术标签:
【中文标题】VSCODE 片段 PHP 自动填充命名空间【英文标题】:VSCODE snippet PHP to fill namespace automatically 【发布时间】:2021-07-17 12:55:45 【问题描述】:我正在尝试为php 创建一个VSCODE CODE SNIPPET,它会自动放置命名空间(基于文件夹路径)。
考虑到我的所有类都位于MVC
文件夹内,并且它位于src
文件夹内,因此想法是在当前文档的目录上进行替换,示例:
我用 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 自动填充命名空间的主要内容,如果未能解决你的问题,请参考以下文章