【发布时间】:2017-11-09 02:36:30
【问题描述】:
我有一个类似的数组:
$links = array('home', 'contact', 'profile/*', 'link1', 'link2');
然后我有一个类似的字符串:
$current_url = 'profile/user1';
是否可以测试数组$links 是否包含$current_url 而无需循环遍历$links
我知道如何使用循环和fnmatch() 函数来做到这一点,但我会尽可能避免循环。
这里的问题是我想用通配符匹配完整的字符串。
【问题讨论】:
-
strpos 怎么样?
-
$links是否需要是一个数组,它们是静态的还是以某种方式动态定义的?会考虑改用正则表达式,例如 3v4l.org/octM2 这样您可以定义更复杂的模式和模式组合,而不仅仅是*通配符。 -
能否详细说明通配符
*的变量使用?它总是意味着non-slash吗?这可能意味着一组部分字母吗?您将需要进行某种循环——要么使用管道(迭代函数)构建正则表达式模式,要么使用 foreach 循环来检查每个元素。就性能而言,您可以做的最好的事情是在循环中编写一个早期的break条件,或者使用一个一旦找到匹配项就停止的数组函数(如array_search())。如果这是一个可能的元素:'profile/*/links/*',那么您将需要使用rsort()对元素进行排序以优先考虑。 -
可以定义偶数模式而不是 *。 $links 始终是一个数组。因为目的是定义页面,用户/所有者访问哪个原因会得到通知。在这种情况下,我想保存有人访问用户个人资料的通知,还有一些 URL 将保存有人喜欢个人资料、添加为朋友、发送消息等的通知。其余的事情基于 $_GET 变量键和值所以很容易。但在这种情况下,它采用永久链接,即页面名/用户名。然后根据 $current_url 匹配设置规则保存什么类型的通知。