我的问题与此类似,但我无法让它工作: 路径正则表达式 - 只允许一个级别
我有一个数组,其中包含来自网站的一堆或网址,这些网址是类别或子类别页面,因此:
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