VSCODE фрагмент PHP для автоматического заполнения пространства имен

Я пытаюсь создать SNIPPET VSCODE CODE для PHP, который автоматически помещает пространство имен (на основе пути к папке).

Идея состоит в том, чтобы сделать замену в каталоге текущего документа, учитывая, что весь мой класс находится внутри папки 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 variabe $TM_DIRECTORY.

Aparently не имеет ошибок на 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;

Может кто поможет исправить?

Большое спасибо!!!


person Allan Andrade    schedule 23.04.2021    source источник


Ответы (2)


Вы можете использовать

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

См. демонстрацию регулярных выражений.

Это соответствует

  • (?:.*[\/\\])? - необязательное вхождение любых символов 0+, кроме символов разрыва строки, как можно больше, а затем либо \, либо /
  • src[\/\\] - строка src, а затем _7 _ / _ 8_
  • ([^\/\\]*) - Группа 1: любые символы, равные нулю или более, кроме / и \
  • [\/\\]? - необязательный _13 _ / _ 14_ символ
  • | - or
  • [\/\\] - символ \ или /
  • ([^\/\\]*) - Группа 2: любые символы, равные нулю или более, кроме / и \

Демо:

введите описание изображения здесь

person Wiktor Stribiżew    schedule 23.04.2021
comment
Пытаюсь понять: To / any_other_folder / src / MVC / Models / Access / SubFolderEndssrc / Auth - MVC, захваченный регулярным выражением в группе 1, и массив [Access, SubFolderEndssrc, Auth] в группе 2. Модель не была захвачена .... как эта замена работает $ 1 \\ $ 2, почему она присоединяется к group1 + 'Model' (not caputured) + group2 .... и заменяет '/' на '\' тоже? Большое спасибо! - person Allan Andrade; 23.04.2021
comment
@AllanAndrade Если Группа 1 не соответствует, $1 пусто, поэтому возвращается значение \ + Группа 2. Поскольку часть Models не совпадает, она не заменяется и сохраняется в результирующей строке. - person Wiktor Stribiżew; 23.04.2021
comment
@AllanAndrade Я пропустил начальный \, я добавил его только сейчас. Итак, используйте "namespace \\\\${TM_DIRECTORY/(?:.*[\\/\\\\])?src[\\/\\\\]([^\\/\\\\]*)[\\/\\\\]?|[\\/\\\\]([^\\/\\\\]*)/$1\\$2/g}", - person Wiktor Stribiżew; 23.04.2021
comment
Виктор, еще раз спасибо! Я обновил его, добавив ваш комментарий выше! - person Allan Andrade; 24.04.2021

Использование $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
  • |: разделение альтернатив
  • [/\\]: разделитель каталогов
  • ([^/\\]+): Группа 2: имя каталога

Вы хотите, чтобы каждое имя каталога в результате было предварено символом \, а группа 1 или группа 2 пуста, поэтому мы можем использовать строку замены: \$1$2

person rioV8    schedule 23.04.2021