0

为了解析 url,我第一次深入研究了正则表达式。无需过多深入,我基本上想要友好的 url,并且我将每个永久链接保存在数据库中,但由于语言和页面的差异,我只想保存一个永久链接并解析页面和语言的 url。所以,如果我得到这样的东西:

http://domain.com/lang/fr/category/9/category_title/page/3.html

我真正想要的是这个“category/9/category_title”来知道我在哪个页面上。我想出了这个功能:

$return = array();

$string = 'http://domain.com/lang/fr/category/9/category_title/page/3.html';

//Remove domain and http
$string = preg_replace('@^(?:http://)?([^/]+)@i','',$string);

if(preg_match('/^\/lang\/([a-z]{2})/',$string,$langMatches)) {
 $return['lang'] = $langMatches[1];
 //Remove lang
 $string = preg_replace('/^\/lang\/[a-z{2}]+/','',$string);
} else {
 $return['lang'] = 'en';
}

//Get extension
$bits = explode(".", strtolower($string));
$return['extension'] = end($bits);

//Remove extension
$string = preg_replace('/\.[^.]+$/','',$string);

if(preg_match('/page\/([1-9+])$/',$string,$pageMatches)) {
 $return['page'] = $pageMatches[1];
 //Remove lang
 $string = preg_replace('/page\/[1-9+]$/','',$string);
} else {
 $return['page'] = 1;
}

//Remove additional slashes from beginning and end
$string = preg_replace('#^(/?)|(/?)$#', '', $string);

$return['permalink'] = $string;

print_r($return);

从上面的例子中返回这个:

Array
(
    [lang] => fr
    [extension] => html
    [page] => 3
    [permalink] => category/9/category_title
)

这是完美的,正是我想要的。但是我的问题是,我是否正确使用了正则表达式?有没有更好的方法可以做到这一点,例如,我可以在开头和结尾去掉域、扩展名和额外的斜杠吗?

4

3 回答 3

2

您应该使用parse_url将 URL 拆分为其组件。并且当拥有 URL 路径时,您可以使用explode将路径拆分为其段、array_slice获取特定段并pathinfo获取扩展名。

于 2010-07-24T12:51:52.720 回答
0

下面的表达式是,希望与编程语言无关。

^.*?\\.[^/]+/[^/]+/([^/]+)/([^/]+/[^/]+/[^/]+)/.*(\\d+)\\.(\\w+).*$

让我解释一下这是做什么的。

我消耗了整行(由 ^ 和 $ 锚定)并最初朝着最后一个 '.' 工作。域中的字符。从那里我使用域的最后一个元素和第一个路径元素以及每个元素后面的“/”分隔符,然后我使用捕获组来获取语言字段和路径的下三个元素段,然后丢弃到文件名的开头并使用另外两个组来捕获文件名和扩展名,丢弃空格(如果有的话)到行尾。

需要注意的是,我对上面的表达式进行了最少的测试,但相信它可以处理大多数由 ASCII 范围内的字符组成的 URL。它也非常特定于 URL 的结构,不会处理超过一行的 URL。

于 2010-07-24T17:44:12.493 回答
0

PHP 有parse_url函数。

强烈推荐这种方法,尤其是与使用正则表达式相反。

于 2010-07-24T12:53:25.623 回答