我正在尝试实现一个php脚本,该脚本将在每次调用我的网站时运行,查找特定的URL模式,然后展开URL并执行重定向。
基本上我想在新的CMS上运行它以捕获来自旧CMS的所有传入链接,并根据映射重定向,将文章ID从URL导入到导入新CMS数据库的相同文章ID中。
我可以执行,重定向等,但我在正则表达式上迷失了。
我需要抓住任何事件:
domain.com/content/view/*/34/
或domain.com/content/view/*/30/
(其中*是通配符)并在变量中捕获*
和30
或34
,我将在其中使用数据库查询。
如果遇到以下情况:
domain.com/content/view/*/34/1/*/
我需要捕获第一个*
和第二个*
。
非常感谢能够帮助我的人。
答案 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。熟悉正则表达式会很常见。