过滤包含白名单子字符串且不包含任何黑名单子字符串的网址数组

问题描述 投票:0回答:3

我有一个如下所示的数组

[
    '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',
]

我想要:

  1. 删除所有空数组元素,
  2. 删除每个数组项而不 名称中包含扩展名
    .jpg
    .png
    .gif
  3. 并删除包含关键字的数组项,例如
    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 

有什么想法吗?

php arrays regex filtering preg-grep
3个回答
7
投票

使用例如 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);

(适用于给定的数组,但可能需要更改;这是演示代码。)


4
投票
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]);
    }
}

0
投票

所需的业务逻辑可以烘焙到单个正则表达式模式中。

从输入字符串的前面开始,一次遍历一个字符,如果遇到黑名单子字符串则取消整个字符串的资格。然后仅限定具有白名单文件类型的字符串。我使用

[^?]
而不是
.
来强制在 url 的可能查询字符串段之前满足条件。

因此,任何包含白名单文件类型之一的 url 字符串都将是非空字符串。

如果需要进一步加强验证,则提问者必须解释更好的规则,并提供一组更具挑战性的输入字符串。

代码:(演示

var_export(
    preg_grep(
        '/^(?:(?:digg|fb|tweet|bizspark)(*SKIP)(*FAIL)|[^?])+\.(?:gif|jpg|png)/i',
         $array
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.