2013-06-13 259 views
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)) { 
+0

CRD啊是啊,它仍然很早我会编辑这个帖子。不,它不需要匹配空字符串。 – mic

回答

2

我觉得像这样的工作:

^C?R?U?D?$ 

为了避免匹配空字符串,你可以使用一个前向断言:

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

非常感谢'^(?!$)C?R?U?D?$'可以作为一种享受:-) – mic

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 
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 ?