【问题标题】:Regular Expressions - Parsing a url正则表达式 - 解析 url
【发布时间】:2011-03-20 12:03:32
【问题描述】:

我第一次研究正则表达式是为了解析一个 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
)

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

【问题讨论】:

    标签: regex url dns strip


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      PHP 有parse_url 函数。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 确实,可以添加explode('/',$pathstring) 以轻松找到正确的路径段。
        • 这会比正则表达式占用更少的资源吗?
        • @Rob:我没有这方面的任何信息。但它可能比使用正则表达式更全面、更完美、更灵活。
        猜你喜欢
        • 2012-08-23
        • 2012-06-15
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多