0

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

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

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);

产生一个空数组。

什么模式可以正确匹配?

4

3 回答 3

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/ )
于 2013-10-09T02:11:26.610 回答
1

这输出:

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

<?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);
于 2013-10-09T02:15:30.793 回答
0

我认为这有效:

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

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

于 2013-10-09T02:17:23.577 回答