PHP正则表达式模式 - 如果只有一个级别匹配网址

时间:2013-10-09 02:00:08

标签: php regex

我的问题与此类似,但我无法让它发挥作用:Path Regular Expression - Allow only one level

我有一个数组,其中包含来自网站的一堆或网址,可以是类别或子类别页面,所以:

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后第一组/ /的内容的网址都应该被过滤掉。

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

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

产生一个空数组。

哪种模式会正确匹配?

3 个答案:

答案 0 :(得分:1)

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

$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/ )

答案 1 :(得分:1)

输出:

阵 (     [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);

答案 2 :(得分:0)

我认为这有效:

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

它只允许在.com之后输入两个正斜杠。 在这里玩... http://rubular.com/r/TBLpnJFdJg