1

假设我有数组:

[test1] = '/'
[test2] = '/foo'
[test3] = '/foo/*'
[test4] = '/bar/*'
[test5] = '/baz/*/bar'

什么是有效的 grep 规则,需要将这些规则转换为满足对preg_match输入执行功能(以规则为模式),以便返回以下输入。比如,规则需要封装什么,*s需要替换成什么?

input          :   returned
/              :   test1
/foo           :   test2
/foo/bar       :   test3
/foobar        :   none
/bar           :   test4
/bar/foo       :   test4
/barfoo        :   none
/baz/foo/bar   :   test5
/baz//bar      :   none
4

3 回答 3

1

用。。。来代替:

[^/]+

这表示非斜线字符的非空字符串。我正在根据您的上一个示例做出假设(/baz//bar返回“无”)。

当然,如果需要,请避开斜线。

于 2012-08-10T18:15:40.667 回答
1

我认为从字符串中提取pathfilename可能会更好:

^(\/(?:[^\\/:*?"<>|]+\/)*)([^\\/:*?"<>|]+)*$

第 1path
组: 第 2 组:filename

使用这些信息进行查表(例如哈希数组)

于 2012-08-10T18:25:10.517 回答
1

最后,我做到了:

<?php
$urlRule = str_replace('/', '\/', $urlRule);
$urlRule = '/^('.str_replace('*', ')(.*)(', $urlRule).')$/';

if (count(preg_grep($urlRule, array($url))) > 0) { ...

对于每条规则,但我确实需要包括

[test4] = '/bar'

为了要达到

input          :   returned
/bar           :   test4
于 2012-08-10T18:56:36.277 回答