URL上的PHP正则表达式-拆分为变量
我正在尝试实现一个php脚本,它将在每次调用我的站点时运行,查找特定的URL模式,然后分解URL并执行重定向 基本上,我想在一个新的CMS上运行它,以捕获来自旧CMS的所有传入链接,并根据映射重定向,例如,从URL剥离的文章id到导入新CMS数据库的相同文章id 我可以实现,重定向等,但我对正则表达式迷茫了 我需要捕捉以下任何事件: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
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