如何检查字符串匹配数组中的正则表达式之一?

时间:2017-05-16 19:10:32

标签: php arrays regex string laravel

我想在项目中创建类似权限的内容。 我如何检查字符串匹配数组中的正则表达式之一?

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

的验证

UPD: 我现在用它,但看起来这不好。

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");

P.S。我用Laravel。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

你可以通过in_array()检查或者你对这些值进行内爆,正则表达式是这样的:/(permission1 | permisson2 ..)/

答案 2 :(得分:-1)

我想这是你能做的:

  • 从字符串中删除。*(如果有)。
  • 在foreach循环中通过权限检查字符串是否以上面的操作字符串开头

不需要正则表达式。