Строка соответствия регулярному выражению

Это должно быть очень легко для эксперта по регулярным выражениям.

У меня есть название группы <APP>_<Resource>_<Action> сегмент действия содержит комбинацию или CRUD. Существует 13 возможных комбинаций, в которых они могут появляться.

CRUD, CRU, CRD, CUD, RUD, CR, CU, CD, RU, RD, UD, C, R, U, D

Я просто хочу, чтобы регулярное выражение совпадало с этими шаблонами в сегменте действия имени группы. Приложение и ресурсы могут меняться на различные строки.

Примеры имен групп

PM_folder1_cru, PM_folder2_ud, PM_folder3_cr, PM_folder4_cu, PM_personalFolder_crud

заранее спасибо

РЕДАКТИРОВАТЬ

В настоящее время это делается с помощью:

$allowedActions = ['CRUD', 'CRU', 'CRD', 'CUD', 'RUD', 'CR', 'CU', 'CD', 'RU', 'RD', 'UD', 'C', 'R', 'U', 'D'];

if (in_array(strtoupper($action), $allowedActions)) {

3 ответа

Решение

Я думаю, что-то вроде этого будет работать:

^C?R?U?D?$

Чтобы избежать совпадения с пустыми строками, вы можете использовать предварительное утверждение:

^(?!$)C?R?U?D?$

Как насчет:

/^.*_(?=[CRUD]{1,4})C?R?U?D?$/i

использование:

$arr = array(
'PM_folder1_cru',
'PM_folder2_ud',
'PM_folder3_cr',
'PM_folder4_cu',
'PM_personalFolder_crud',
);

foreach ($arr as $str) {
    if (preg_match('/^.*_(?=[CRUD]{1,4})C?R?U?D?$/i', $str)) 
        echo "OK : $str\n";
    else
        echo "KO : $arr\n";
}

выход:

OK : PM_folder1_cru
OK : PM_folder2_ud
OK : PM_folder3_cr
OK : PM_folder4_cu
OK : PM_personalFolder_crud

Примечание: этот ответ предполагает, что APP содержит только буквы и Resource содержит только буквы и цифры.

Вы можете сделать более общее соответствие, используя класс символов:
(?i)[a-z]+_[a-z0-9]+_[crud]{1,4}, Обратите внимание, что это также будет соответствовать DRUC, DDDD, RRC например.

Если вы не хотите этого, вы можете использовать что-то более конкретное:
(?i)[a-z]+_[a-z0-9]+_(?:c?r?ud?|cr?d?|r?d|r)

Что это значит?

  • (?i): установить i модификатор для соответствия без учета регистра
  • [a-z]+: совпадать буквы один или несколько раз
  • _: соответствовать одному подчеркиванию
  • [a-z0-9]+: сопоставлять буквы и цифры один или несколько раз
  • _: соответствовать одному подчеркиванию
  • (?:c?r?ud?|cr?d?|r?d|r): матч crud, cru, rud, c, r, d etc...

Код PHP:
Если вы хотите получить действие в отдельном (под) массиве, вы можете добавить именованную группу и удалить ?::

$string = 'PM_folder1_cru,
PM_folder2_ud,
PM_folder3_cr,
PM_folder4_cu,
PM_personalFolder_crud';
preg_match_all('#(?i)[a-z]+_[a-z0-9]+_(?P<action>c?r?ud?|cr?d?|r?d|r)#', $string, $m);
print_r($m['action']); // Get actions
print_r($m); // everything ?
Другие вопросы по тегам