【问题标题】: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.editadmin.users.create 等的地方做任何工作。
  • @u_mulder * 符号是正则表达式
  • 这不是答案,但请注意,在正则表达式中,. 是一个特殊字符,* 与通配符匹配、typeglob 等中的含义不同. 如果您希望正则表达式匹配文字 .,请使用 \.。如果您想要 typeglob 样式的 *,请使用 .+(或 .*,如果您希望空字符串成为有效匹配项)。例如,使用 'admin\\.users\\..+' 代替 'admin.users.*'。您用作正则表达式的字符串将匹配您要匹配的字符串,但也匹配其他字符串,例如 admin-userstrike

标签: php arrays regex string laravel


【解决方案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 循环中通过权限检查字符串是否以上面的操作字符串开头

      不需要正则表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-18
        • 2016-02-11
        • 1970-01-01
        • 2022-11-12
        • 2017-04-15
        • 2021-12-18
        • 1970-01-01
        相关资源
        最近更新 更多