如何创建仅在有2个字符时匹配的PCRE模式

时间:2011-05-11 14:44:28

标签: php regex url-routing

我目前正在尝试创建SEO友好的URL。因此我创建了以下正则表达式。我想要的是当URL是例如:

时引导另一个URL
da/something/something-else.html => 'da/pages/view/something/something-else'
something/something-else.html => 'pages/view/something/something-else'
something => 'pages/view/something'

我创建了这个正则表达式:

'/(([a-z][^\/])(1))(?:(\/))([^.]+)\.html/' => '$1$2pages/view/$3/'

我们需要的是,第一部分必须长2 - 如果不是,那么它不是语言标签,不应该通过。然后剩下的就是没有。 (点)里面(因为“.html”部分)。

这可能吗?

3 个答案:

答案 0 :(得分:3)

我没有对它进行过测试,但您可以通过这种方式为表达式添加限制:

'#^/[a-z]{2}/(([a-z][^\/])(1))(?:(\/))([^.]+)\.html#' => '$1$2pages/view/$3/'

^ / [a-z] {2} /将强制在行的开头(^)有2 [a-z]。

我已将分隔符从/更改为#,因此您无需转义/.

PS。语言代码如果包含区域修饰符,则可以包含2个以上的字母:pt_BR,pt_PT和en_US。

答案 1 :(得分:3)

尝试使用:

$arr = array('da/something/something-else.html', 'something/something-else.html', 'something');
foreach ($arr as $str) {
    echo $str,' => ';
    $str = preg_replace("~^([a-z]{2}/|)([^.]*)(?:\.html)?$~", "$1pages/view/$2", $str);
    echo $str,"\n";
}

<强>输出:

da/something/something-else.html => da/pages/view/something/something-else
something/something-else.html => pages/view/something/something-else
something => pages/view/something
可以查看

解释here

答案 2 :(得分:0)

假设您的主题文本始终是相对URL,则应执行此操作:

$re = '%^([A-Za-z]{2}/)?(.*?)(\.html)?%i';
$url = preg_replace($re, '$1pages/view/$2', $url);

修改已修复以删除可选的.html扩展程序。