对于正则表达式专家来说,这应该是一个非常简单的方法。
我有一个组名<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)) {
答案 0 :(得分:2)
我认为这样的事情会起作用:
^C?R?U?D?$
为避免匹配空字符串,您可以使用前瞻断言:
^(?!$)C?R?U?D?$
答案 1 :(得分: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
答案 2 :(得分:0)
注意:此答案假设
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 ?