URL上的PHP正则表达式-拆分为变量

URL上的PHP正则表达式-拆分为变量,php,regex,Php,Regex,我正在尝试实现一个php脚本,它将在每次调用我的站点时运行,查找特定的URL模式,然后分解URL并执行重定向 基本上,我想在一个新的CMS上运行它,以捕获来自旧CMS的所有传入链接,并根据映射重定向,例如,从URL剥离的文章id到导入新CMS数据库的相同文章id 我可以实现,重定向等,但我对正则表达式迷茫了 我需要捕捉以下任何事件: domain.com/content/view/*/34/或domain.com/content/view/*/30/(其中*是通配符)并在变量中捕获*和30或34

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

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

我可以实现,重定向等,但我对正则表达式迷茫了

我需要捕捉以下任何事件:

domain.com/content/view/*/34/
domain.com/content/view/*/30/
(其中*是通配符)并在变量中捕获
*
30
34
,然后在DB查询中使用

如果遇到以下情况:

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

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


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

其实很简单,一种更灵活、更直接的方法是将url分解成一个名为
$segments
的数组,然后在那里进行测试。如果预期的URL数量很少,那么这种方法可能更易于维护和阅读


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

实际上非常简单,更灵活、更直接的方法是将url分解成一个名为
$segments
的数组,然后在那里进行测试。如果预期的URL数量很少,那么这种方法可能更易于维护和阅读


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

我不确定正则表达式是否可行。我认为使用
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]

轻松获得所需的信息。我不确定正则表达式是否适合。我认为使用
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]

轻松获取所需信息。首先,我将使用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的《掌握正则表达式》。对正则表达式有很好的了解会经常派上用场


首先,我将使用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的《掌握正则表达式》。对正则表达式有很好的了解会经常派上用场


您可以使用.htaccess文件和/或mod_重写吗?此外,您没有显示有效的URL。它缺少计划部分。您的URL是否包含该方案,例如使用哪种协议?请提供更多关于URL结构的信息,例如,我们可以期待哪些变化。嗨,戈登。是的,我可以使用htaccess/modrewrite。我更喜欢使用php脚本,因为我可能需要在数据库中查找正确的条目,据我所知,这在htaccess中是不可能的。这是一个常规的http协议,其变体是usuasl http://和。版本,但其他方面的URL将如上所述,当然除了通配符。尾随斜杠应始终存在。谢谢,你能使用.htaccess文件和/或mod_重写吗?此外,您没有显示有效的URL。它缺少计划部分。您的URL是否包含该方案,例如使用哪种协议?请提供更多关于URL结构的信息,例如,我们可以期待哪些变化。嗨,戈登。是的,我可以使用htaccess/modrewrite。我更喜欢使用php脚本,因为我可能需要在数据库中查找正确的条目,据我所知,这在htaccess中是不可能的。这是一个常规的http协议,其变体是usuasl http://和。版本,但其他方面的URL将如上所述,当然除了通配符。尾随斜杠应始终存在。谢谢,DanThanks-当使用此方法运行preg_匹配时,我似乎对未知的修饰符“v”有问题?我忘记了避开正斜杠。preg_match()认为它们是分隔正则表达式的特殊字符。请看我的更新后的代码样本。它已经过PHP5.3测试,应该是向后兼容的。完美-我想我可以从这里完成!谢谢。谢谢-当使用这种方法运行preg_匹配时,我似乎对未知的修饰符“v”有问题?我忘了避开正斜杠。preg_match()将它们视为d