用于识别URL的速记Preg匹配规则

时间:2012-08-10 17:52:27

标签: php regex preg-match

让我说我有阵列:

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

什么是有效的grep规则,这些规则需要转换为满足对输入执行preg_match函数(使用规则作为模式),以便返回以下输入。例如,需要封装规则的内容是什么,以及*需要替换的内容是什么?

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

3 个答案:

答案 0 :(得分:1)

替换为:

[^/]+

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

当然,如果需要,可以逃避斜线。

答案 1 :(得分:1)

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

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

第1组:path
第2组:filename

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

答案 2 :(得分:1)

最后,我做到了这一点:

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

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

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

[test4] = '/bar'

为了实现

input          :   returned
/bar           :   test4