我有一个如下所示的数组
[
'http://api.tweetmeme.com/imagebutton.gif?url=http://mashable.com/2010/09/25/trailmeme/',
'http://cdn.mashable.com/wp-content/plugins/wp-digg-this/i/gbuzz-feed.png',
'http://mashable.com/wp-content/plugins/wp-digg-this/i/fb.jpg',
'http://mashable.com/wp-content/plugins/wp-digg-this/i/diggme.png',
'http://ec.mashable.com/wp-content/uploads/2009/01/bizspark2.gif',
'http://cdn.mashable.com/wp-content/uploads/2010/09/web.png',
'http://mashable.com/wp-content/uploads/2010/09/Screen-shot-2010-09-24-at-10.51.26-PM.png',
'http://cdn.mashable.com/wp-content/uploads/2009/02/bizspark.jpg',
'http://feedads.g.doubleclick.net/~at/lxx00QTjYBaYojpnpnTa6MXUmh4/0/di',
'',
'http://feedads.g.doubleclick.net/~at/lxx00QTjYBaYojpnpnTa6MXUmh4/1/di',
'',
'http://feeds.feedburner.com/~ff/Mashable?i=0N_mvMwPHYk:j5Pmi_N-JQ8:D7DqB2pKExk',
'',
'http://feeds.feedburner.com/~ff/Mashable?i=0N_mvMwPHYk:j5Pmi_N-JQ8:V_sGLiPBpWU',
'',
'http://feeds.feedburner.com/~ff/Mashable?i=0N_mvMwPHYk:j5Pmi_N-JQ8:F7zBnMyn0Lo',
'',
'http://feeds.feedburner.com/~ff/Mashable?d=qj6IDK7rITs',
'',
'http://feeds.feedburner.com/~ff/Mashable?d=_e0tkf89iUM',
'',
'http://feeds.feedburner.com/~ff/Mashable?i=0N_mvMwPHYk:j5Pmi_N-JQ8:gIN9vFwOqvQ',
'',
'http://feeds.feedburner.com/~ff/Mashable?d=yIl2AUoC8zA',
'',
'http://feeds.feedburner.com/~ff/Mashable?d=P0ZAIrC63Ok',
'',
'http://feeds.feedburner.com/~ff/Mashable?d=I9og5sOYxJI',
'',
'http://feeds.feedburner.com/~ff/Mashable?d=CC-BsrAYo0A',
'',
'http://feeds.feedburner.com/~ff/Mashable?i=0N_mvMwPHYk:j5Pmi_N-JQ8:_cyp7NeR2Rw',
'',
'http://feeds.feedburner.com/~r/Mashable/~4/0N_mvMwPHYk',
]
我想要:
.jpg
、.png
或 .gif
,digg
、fb
、tweet
、bizspark
。我希望保留它:
5 => http://cdn.mashable.com/wp-content/uploads/2010/09/web.png
6 => http://mashable.com/wp-content/uploads/2010/09/Screen-shot-2010-09-24-at-10.51.26-PM.png
有什么想法吗?
使用例如 array_filter() 将为您提供灵活性和易于维护(更改需求、调试等):
function url_array_filter($url)
{
static $words = array('digg', 'fb', 'tweet', 'bizspark');
static $extens = array('.jpg', '.png', '.gif');
$ret = true;
if (!$url) {
$ret = false;
} elseif (str_replace($words, '', $url) != $url) {
$ret = false;
} else {
$path = parse_url($url, PHP_URL_PATH);
if (in_array(substr($path, -4), $extens)) {
$ret = false;
}
}
return $ret;
}
$arr = array_filter($arr, 'url_array_filter');
print_r($arr);
(适用于给定的数组,但可能需要更改;这是演示代码。)
foreach ($array as $key => $value) {
if (
empty($value)||
(preg_match('#^http:\/\/(.*)\.(gif|png|jpg)$#i', $value) == 0)||
(preg_match('#(tweet|bizspark)#i', $value) > 0)
) {
unset($array[$key]);
}
}
所需的业务逻辑可以烘焙到单个正则表达式模式中。
从输入字符串的前面开始,一次遍历一个字符,如果遇到黑名单子字符串则取消整个字符串的资格。然后仅限定具有白名单文件类型的字符串。我使用
[^?]
而不是 .
来强制在 url 的可能查询字符串段之前满足条件。
因此,任何包含白名单文件类型之一的 url 字符串都将是非空字符串。
如果需要进一步加强验证,则提问者必须解释更好的规则,并提供一组更具挑战性的输入字符串。
代码:(演示)
var_export(
preg_grep(
'/^(?:(?:digg|fb|tweet|bizspark)(*SKIP)(*FAIL)|[^?])+\.(?:gif|jpg|png)/i',
$array
)
);