Issue
First off, I have the following psr-4 declaration for the src folder inside my composer.json file:
"autoload": {
"psr-4": {
"Src\\": "src/"
}
},
I would like to build a VSCode snippet that autogenerates the namespace of a new file that resides inside the src folder.
So far I have this inside php.json:
"Namespace Src": {
"prefix": "ns_src",
"body": [
"namespace ${RELATIVE_FILEPATH};",
],
"description": "Namespace for file routes inside the src folder"
},
Taking as an example the following file:
src/MyEntity/Application/MyUseCase.php
The desired result would be:
namespace Src\MyEntity\Application;
And right now this is what it returns to me:
namespace src/MyEntity/Application/MyUseCase.php;
So I need to tackle:
- Upper case of src.
- Replacement of forward slashes
/into back slashes\. - Removal of everything that is after the last forward slash
/.
I know there has to be a way to do this with regex. I have read this similar problem (VSCODE snippet PHP to fill namespace automatically) but I haven't quite got the hang of it after reading it.
And I think the upper case problem could maybe be solved with \F as in here:
https://www.regular-expressions.info/replacecase.html#:~:text=In%20the%20regex%20%5CU%5Cw,is%20not%20a%20word%20character.
Is this the right approach? Could you give me any tips on this problem?
Thank you so much.
Solution
You can use
"Namespace Src": {
"prefix": "ns_src",
"body": [
"namespace ${RELATIVE_FILEPATH/^(?:.*[\\\\\\/])?(src)(?=[\\\\\\/])|[\\\\\\/][^\\\\\\/]*$|([\\\\\\/])/${1:+Src}${2:+\\\\}/g};",
],
"description": "Namespace for file routes inside the src folder"
},
See the regex demo. Details:
^(?:.*[\\\/])?(src)(?=[\\\/])- start of string (^), then an optional occurrence of any zero or more chars as many as possible (.*) and a\or/char ([\\\/]), and thensrccaptured into Group 1, that is immediately followed with/or\|- or[\\\/][^\\\/]*$- a\or/char and then zero or more chars other than/and\till end of string|- or([\\\/])- Group 2: a\or/char.
The ${1:+Src}${2:+\\\\} replacement replaces in this way:
${1:+Src}- if Group 1 matched, replace withSrc${2:+\\\\}- if Group 2 matched, replace with\.
Answered By - Wiktor Stribiżew Answer Checked By - Candace Johnson (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.