我的问题与此类似,但我无法让它发挥作用: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);
产生一个空数组。
哪种模式会正确匹配?
答案 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