【问题标题】:Search in PHP array full string match to string with wild card在 PHP 数组中搜索与通配符字符串匹配的完整字符串
【发布时间】: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 匹配设置规则保存什么类型的通知。

标签: php arrays match wildcard


【解决方案1】:

您可以使用array_filter 提取尊重某个比较函数的数组的所有值。这个比较函数可以测试通配符。

像这样:

$links = array('home', 'contact', 'profile/*', 'link1', 'link2');
$current_url = 'profile/user1';

function match($string) {
    // Check if $string matches $current_url
}
array_filter($links, "match");

如果 array_filter 包含某些内容,则 url 匹配。

【讨论】:

  • 此答案缺少关键处理部分,无法成为真正有用的答案。这篇文章更适合作为对以下问题的评论:“您是否尝试过使用array_filter()?”这个答案是我希望 OP 作为自我解决的失败/不完整尝试在问题中发布的。
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2011-09-04
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多