PHP 正则表达式模式 - 如果只有一级深度,则匹配 url


PHP Regex Pattern - Match url if only one level deep

我的问题与此类似,但我无法让它工作: 路径正则表达式 - 只允许一个级别

我有一个数组,其中包含来自网站的一堆或网址,这些网址是类别或子类别页面,因此:

http://www.mysite.com/dogs/
http://www.mysite.com/cats/
http://www.mysite.com/food/

是类别页面(仅超出根域的级别(

子类别页面如下所示:

http://www.mysite.com/dogs/poodles/
http://www.mysite.com/cats/siamese/
http://www.mysite.com/food/pizza/

我想去掉子类别,只剩下数组中的类别页面。 任何包含根 url 后第一组//以外的任何内容的 url 都应被过滤掉。

我想我需要使用preg_grep但使用我上面引用的更新答案中的模式,例如

$regex = "#^/[^/]+/?$#";    
$categories_only = preg_grep($regex,$array);

生成一个空数组。

什么模式可以正确匹配?

所以我认为你不需要正则表达式来完成这个任务。您可以实现一个函数来过滤数组:

$urls = array('http://www.mysite.com/dogs/',
        'http://www.mysite.com/cats/siamese/junk/?trash=1&x=y',
        'http://www.mysite.com/food/pizza/');
function filter_url($url) {
    $split = explode('/', $url);
    return (count($split) == 5 && empty($split[4])) || 
           (count($split) == 4 && !empty($split[3]));
}
print_r(array_filter($urls, 'filter_url'));

这将输出:

Array ( [0] => http://www.mysite.com/dogs/ )

这输出:

数组( [2] => http://www.mysite.com/dogs/ [3] => http://www.mysite.com/cats/ [4] => http://www.mysite.com/food/)

<?php
$array = array("http://www.mysite.com/dogs/poodles/",
"http://www.mysite.com/cats/siamese/",
"http://www.mysite.com/dogs/",
"http://www.mysite.com/cats/",
"http://www.mysite.com/food/",
"http://www.mysite.com/food/pizza/");
$regex = "#^http://[^/]+/?[^/]+/?$#";
$categories_only = preg_grep($regex,$array);
print_r($categories_only);

我认为这有效:

^(https?:'/'/)?(['da-z'.-]+)'.([a-z'.]{2,6})'/(['da-z'.-]+)'/

它只允许在.com或其他任何东西之后使用两个正斜杠。在这里玩...http://rubular.com/r/TBLpnJFdJg