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

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.editadmin.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 [重复]

Python:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法

如何匹配plsql中正则表达式中的列表/数组?