棘手的PHP正则表达式问题

时间:2010-01-20 05:40:13

标签: php regex

对某些人来说可能并不棘手,但对我来说却很棘手。

我最近在博客上移动了一些内容,我需要轻松地将用户重定向到新页面。

以前,我的所有文章都是这样链接的:

http://www.my-site.com/blog/my-article-title

但我改为:

http://www.my-site.com/blog/article/my-article-title

我想将访问“blog / my-article-title”的用户重定向到“blog / article / my-article-title”。

棘手的部分是我的博客还有其他部分,例如档案和搜索,其网址为“博客/档案”或“博客/搜索”。正如您可能已经想到的那样,需要一个更智能的解决方案,因此查找我的档案页面的用户不会被转发到称为“档案”的不存在的文章。

任何帮助?

3 个答案:

答案 0 :(得分:6)

你想使用mod_rewrite(或你的网络服务器等效)而不是php。

答案 1 :(得分:4)

在.htaccess文件中这比PHP更好;和杰米·扎温斯基(Jamie Zawinski)关于如果你使用正则表达式弹簧有两个问题的着名引言。您需要.htaccess的最小正则表达式,而PHP则不需要。

RewriteCond $1 !^(archives|search)
RewriteRule blog/(.*) http://www.my-site.com/blog/article/$1 [R=301]

或者,如果您有RedirectMatch可用,则可以将其与已建议的否定前瞻结合使用:

RedirectMatch permanent blog/((?!archives|search).+) http://www.my-site.com/blog/article/$1

如果您需要使用PHP:

$urlparts = explode('/', $_SERVER['REQUEST_URI']);

if ( ! in_array($urlparts[1], array('archives', 'search')) ) {
    $url = 'http://www.my-site.com/blog/article/' . $urlparts[2]
    header('HTTP/1.1 301 Moved Permanently');
    header("Location: $url");
    exit;
}

正如您所看到的,它在PHP中要复杂得多,并且还需要启动解释器来执行服务器可以执行的操作,因此如果您有选项,请避免使用此方法。

答案 2 :(得分:0)

您可以使用负向前瞻,如下所示:

blog/((?!archives|search).+)