1

考虑以下 URL 列表:

1 http://www.cnn.com/international/stories/423423532
2 http://www.traderscreener.com/blah
3 http://is.gd/fsdaGdfd3
4 http://goo.gl/23V534
5 http://bit.ly/54HFD
6 http://stackoverflow.com/question/ask

我想将缩短的 URL 扩展为原始形式:

$headers = get_headers($URL, 1);
if (!empty($headers['Location'])) {
  $headers['Location'] = (array) $headers['Location'];
  $URL = array_pop($headers['Location']);
}

但是,我需要将所有 URL 与一系列缩短服务进行匹配:

$array(
  'is.gd', 'bit.ly', 'goo.gl', 'wibi.us', 'tinyurl.com' // etc
)

在这种情况下,这将不得不过滤掉 URL 3、4 和 5。我相信最简单的方法是抓取***. http://***/blah由于我使用正则表达式的经验很少,所以需要什么正则表达式?还是有更好的方法来解决这个问题?

4

3 回答 3

2
preg_match('/^http:\/\/(is\.gd|bit\.ly|goog\.gl\|wibi\.us|tinyurl\.com)/i', $URL);
于 2012-04-29T11:39:18.917 回答
2

到目前为止,最简单的方法是不建立黑名单。相反,查询 URL 并查看它是否重定向。发送 HEAD 请求,并查找状态码。如果是 3xx,则存在重定向,因此您应该查找“Location”标头并将其用作新 URL。

于 2012-04-29T11:42:37.927 回答
1

如果您确定 URL 将采用该格式,则可以使用explode()。

$url = "http://bit.ly/54HFD";
$tem = explode("/", $url);

$needles = array(
  'is.gd', 'bit.ly', 'goo.gl', 'wibi.us', 'tinyurl.com' // etc
)

foreach($needles as $needle) {
         $res = strpos($tem[2], $needle);
         if ($res !== false) DO_SOMEHING
}
于 2012-04-29T11:39:54.383 回答