如何检查字符串是不是匹配数组中的正则表达式之一?
Posted
技术标签:
【中文标题】如何检查字符串是不是匹配数组中的正则表达式之一?【英文标题】:How to check is string match one of the regex in array?如何检查字符串是否匹配数组中的正则表达式之一? 【发布时间】:2017-10-16 00:31:13 【问题描述】:我想在我的项目中创建类似权限的东西。 如何检查字符串是否匹配数组中的正则表达式之一?
//Array of user (group) permissions.
$arrayOfPermissions = [
'admin.users.edit',
'admin.users.*',
'dashboard.view',
];
//Check is this permission presents in array
$stringToMatch = 'admin.users.view';
*
符号表示用户拥有该组的所有权限。
例如:
如果用户有权限admin.users.*
,那么他应该通过admin.users.view
的验证
统一更新: 我现在用这个,但是好像不太好。
private function checkPerms($permission)
$arrayOfPermissions = [
'admin.dashboard.view',
'admin.users.*'
];
foreach ($arrayOfPermissions as $perm)
if(preg_match("/".$perm."/", $permission))
return true;
return false;
//This should return `true`
checkPerms("admin.users.view");
附:我使用 Laravel。
【问题讨论】:
数组值不是正则表达式。 为什么不只是admin.users
?
@splash58 因为如果用户有admin.users.*
这样的权限,他应该可以在需要admin.users.edit
或admin.users.create
等的地方做任何工作。
@u_mulder *
符号是正则表达式
这不是答案,但请注意,在正则表达式中,.
是一个特殊字符,*
与通配符匹配、typeglob 等中的含义不同. 如果您希望正则表达式匹配文字 .
,请使用 \.
。如果您想要 typeglob 样式的 *
,请使用 .+
(或 .*
,如果您希望空字符串成为有效匹配项)。例如,使用 'admin\\.users\\..+'
代替 'admin.users.*'
。您用作正则表达式的字符串将匹配您要匹配的字符串,但也匹配其他字符串,例如 admin-userstrike
。
【参考方案1】:
假设权限数组包括以通配符 (*
) 或全名结尾的权限。
遍历权限,
如果它们包含通配符(*
),请检查要检查的权限是否以它开头
否则权限应完全匹配
代码:
echo hasPermission($arrayOfPermissions, $stringToMatch) ? "Has Access" : "Access Denied";
function hasPermission($arrayOfPermissions, $stringToMatch)
// Iterate through all permissions
foreach ($arrayOfPermissions as $permission)
// Check if permission contains a wildcard
if(strpos($permission, '.*'))
$prefix = substr($permission, 0, strpos($permission, '.*'));
if(startsWith($stringToMatch, $prefix))
return true;
// Else, match completely
else
if($permission == $stringToMatch)
return true;
return false;
function startsWith($string, $test)
$length = strlen($test);
return (substr($string, 0, $length) === $test);
【讨论】:
【参考方案2】:您可以通过 in_array() 进行检查,或者将值内爆,正则表达式如下所示:/(permission1|permisson2..)/
【讨论】:
【参考方案3】:我想这是你可以做的:
从字符串中删除 .*(如果有)。 在 foreach 循环中通过权限检查字符串是否以上面的操作字符串开头不需要正则表达式。
【讨论】:
以上是关于如何检查字符串是不是匹配数组中的正则表达式之一?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查字符串是不是与 Thymeleaf 中的正则表达式匹配?
如何检查我的字符串是不是与正则表达式匹配 - Swift 3 [重复]