URL上的PHP Regex - 拆分为变量

时间:2010-08-09 08:49:04

标签: php regex

我正在尝试实现一个php脚本,该脚本将在每次调用我的网站时运行,查找特定的URL模式,然后展开URL并执行重定向。

基本上我想在新的CMS上运行它以捕获来自旧CMS的所有传入链接,并根据映射重定向,将文章ID从URL导入到导入新CMS数据库的相同文章ID中。

我可以执行,重定向等,但我在正则表达式上迷失了。

我需要抓住任何事件:

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

如果遇到以下情况:

  

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

我需要捕获第一个*和第二个*

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

3 个答案:

答案 0 :(得分: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]轻松获取所需信息。

答案 1 :(得分:0)

实际上非常简单,一种更灵活,更直接的方法是将explode() url放入一个名为$segments的数组中,然后在那里进行测试。如果您有非常少量的预期URL,那么这种方法可能更容易维护和阅读。

由于性能开销,我不建议在htaccess文件中执行此操作。

答案 2 :(得分: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