2

对于正则表达式专家来说,这应该是一个很好的简单方法。

我有一个组名<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)) {
4

3 回答 3

2

我认为这样的事情会起作用:

^C?R?U?D?$

为避免匹配空字符串,您可以使用前瞻断言:

^(?!$)C?R?U?D?$
于 2013-06-13T07:57:12.550 回答
1

怎么样:

/^.*_(?=[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
于 2013-06-13T08:15:43.483 回答
0

注意:此答案假设APP仅包含字母且Resource仅包含字母和数字。

您可以使用字符类进行更一般的匹配:
(?i)[a-z]+_[a-z0-9]+_[crud]{1,4}. 请注意,这也将匹配DRUC, DDDDRRC例如。

如果你不想要那个,那么你可以使用更具体的东西:
(?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 ?
于 2013-06-13T08:18:42.930 回答