2010-08-09 57 views
0

我想实现一个PHP脚本,将运行在我的网站的每个电话,寻找某种模式的URL,然后爆炸的URL和执行重定向。PHP的正则表达式的URL - 分裂成变量

基本上我想在一个新的CMS上运行此功能,以捕获来自旧CMS的所有传入链接,并根据映射重定向,例如将文章ID从网址剥离到导入到新CMS的数据库的相同文章ID 。

我可以做的实施,重定向等,但我迷失在正则表达式。

我需要捕捉的任何事件:

domain.com/content/view/*/34/domain.com/content/view/*/30/(其中*是通配符),并在一个变量,我将随后在数据库查询中使用捕捉*3034

如果以下遇到:

domain.com/content/view/*/34/1/*/

我需要拍摄第一*和第二*

非常感谢任何能够帮助我的人。

+0

你可以使用.htaccess文件和/或mod_rewrite的?此外,您没有显示有效的网址。它缺少* scheme *部分。您的网址是否包含*计划*哪个协议被使用?请提供更多关于网址结构的信息,例如我们可以期待什么变化。 – Gordon 2010-08-09 08:55:43

+0

嗨戈登。 是的,我可以使用htaccess/modrewrite。我宁愿使用一个PHP脚本,因为我大概需要查找数据库中正确的条目,而据我所知在htaccess中是不可能的。 这是一个常规的http协议,变体将是usuasl http://和http:// www。版本,但其他明智的URls将如上,当然除了通配符。尾部的斜线应始终存在。 谢谢, 丹 – Dan 2010-08-09 12:53:25

回答

3

我不确定正则表达式是否可行。我想这可能会更容易使用explode ('/' , $url)并通过循环检查该数组进行检查。

下面是步骤我将遵循:

$url = parse_url($url, PHP_URL_PATH); 
$url = trim($url, '/'); 
$parts = explode ('/' , $url); 

然后你就可以检查是否

($parts[0]=='content' && $parts[1]=='view' && $parts[3]=='34') 

你也可以很容易地得到你想要$parts[2]的信息。

+0

谢谢 - 我将如何去使用检查循环?我知道什么是循环,但是是一个特定的检查循环,还是仅仅意味着循环遍历爆炸位并根据数值数组进行检查? 我在想parse_url,爆炸,然后检查循环? – Dan 2010-08-10 11:38:25

+0

检查循环是一个错字。我编辑了我的原始文章更多的细节。 – Green 2010-08-10 12:36:18

+0

谢谢 - 我正在尝试基于执行时间的几个不同选项,但这非常有用。 – Dan 2010-08-11 10:39:48

0

这其实很简单,一个更灵活直接的方法是将explode()的url变成一个叫做$segments的东西,然后在那里测试一下。如果您的网址数量非常少,那么这种方法可能更易于维护和阅读。

我不会推荐在htaccess文件中这样做,因为性能开销。

0

首先,我将使用PHP函数parse_url()来获取路径,不含任何协议或主机名。

一旦你有了下面的代码应该得到你需要的信息。

<?php 

$url = 'http://domain.com/content/view/*/34/'; // first example 
$url = 'http://domain.com/content/view/*/34/1/*/'; // second example 
$url_array = parse_url($url); 

$path = $url_array['path']; 

// Match the URL against regular expressions 
if (preg_match('/content\/view\/([^\/]+)\/([0-9]+)\//i', $path, $matches)){   
     print_r($matches); 
} 

if (preg_match('/content\/view\/([^\/]+)\/([0-9]+)\/([0-9]+)\/([^\/]+)/i', $path, $matches)){   
     print_r($matches); 
} 

?> 

([^ /] +)匹配任何字符序列除了一个斜杠

([0-9] +)号

虽然你也许可以写的任何序列匹配单个正则表达式可以匹配大多数URL变体,可以考虑使用多个正则表达式来检查不同类型的URL。根据您获得的流量,速度并不是那么糟糕。

另外,我建议您阅读O'reilly的Mastering Regular Expressions。对正则表达式的熟悉常常会派上用场。

http://www.regular-expressions.info/php.html

+0

谢谢 - 我使用这种方法运行preg_match时似乎遇到未知修饰符“v”的问题? – Dan 2010-08-10 10:03:15

+0

我忘了逃避正斜线。 preg_match()认为它们是分隔正则表达式的特殊字符。请参阅我的更新后的代码示例。它已经使用PHP 5.3进行了测试,并且应该向后兼容。 – 2010-08-11 04:25:53

+0

完美 - 我想我可以从这里完成!谢谢。 – Dan 2010-08-11 10:41:35