2010-02-06 129 views
2

我有我的服务器的配置Apache重定向每一个请求的index.php,这样我可以使用像URL:现在我需要解析URL以PHP与Apache - 解析URL的mod_rewrite

http://www.website.com/about/us 

确定每条路线是否存在以及期望的路线,因此我可以设置数据库表以保存路线,因此我的客户可以按照他们的喜好编辑路线。事情是,我目前无法进行解析。

这里是我的代码:

$uri = 'about/us'; 
$regex = '(page(/<action>))'; 
if (! preg_match($regex, $uri, $matches)) { 
    echo 'the route doesn\'t match'; 
    exit(); 
} 

它总是会出现在该回波消息。我究竟做错了什么?

编辑:

之所以我需要的正则表达式如下。想象一下,我有一个网址段,如:

/user/yoda 

这里的正则表达式将是有益的解析第一个参数作为一个动作或网页,第二作为重点,将只允许一组特定的字符的,就像如果我希望在这种情况下,第二个参数只能匹配“_-azAZ09”,就像这样。换句话说,为了确定它们中的任何一个是否与uri相匹配,并且确定从该uri开始采取的动作,我将这组正则表达式与uri相比较。使用explode函数可以让我在后面的代码中评估uri段,我想避免这种情况。如果与uri不匹配,请立即将该页面转发到404页面并中断操作。不知道我是否自己清楚..

回答

3

而不是使用正则表达式,为什么不简单地拆分传入的URI?

$uri = 'about/us'; 
list($page, $action) = explode('/', $uri); 

如果需要超过两个,简单地删除列表:

$pagePath = explode('/', $uri); 

但是,如果你上使用正则表达式坚持,这会做:

$regex = '#(?P<page>.*)/(?P<action>.*)#'; 

然而,除了$匹配现在包含$matches['page']$matches['action']之外,它没有什么特别之处 - 但如果您确实需要它,您可以使用list(),如上所示。


使用爆炸功能将使 后来我评价URI段在 代码,至极我想避免

确保该页面是否有效由它代替字符集,为什么不编译一个有效的页面查找表的列表,并只使用php的in_array这比正则表达式快得多?将URL段提取到数组中将允许您立即验证多维数组。

+0

如果情况总是很容易,但它不会。所以我真的需要使用正则表达式。 – yoda 2010-02-06 20:42:23

+0

小心解释为什么? URL总是有“/”,这似乎是一个合适的解决方案。我看不出为什么手动拆分URL条目的正则表达式是必要的。这个问题是否缺少信息,也许? – LiraNuna 2010-02-06 20:45:43

+0

+1正则表达式很贵! – sepehr 2010-02-06 20:56:07

1

的例子。如果你绝对必须使用正则表达式由于某种原因,试试这个:

$uri = 'about/us'; 
$regex = '~(?<path>[^/]+)/(?<action>.+)~'; 
var_dump($matches); 

,输出:

array(5) { 
    [0]=> 
    string(8) "about/us" 
    ["path"]=> 
    string(5) "about" 
    [1]=> 
    string(5) "about" 
    ["action"]=> 
    string(2) "us" 
    [2]=> 
    string(2) "us" 
} 

但是当路径组件只去这只会工作向下一级!