VSCODE 片段 PHP 自动填充命名空间
VSCODE snippet PHP to fill namespace automatically
我正在尝试创建一个 VSCODE CODE SNIPPET for PHP 自动放置命名空间(基于文件夹路径)。
考虑到我所有的 class 都位于 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 片段变量 $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
我正在尝试创建一个 VSCODE CODE SNIPPET for PHP 自动放置命名空间(基于文件夹路径)。
考虑到我所有的 class 都位于 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 片段变量 $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