使用PHP中的正则表达式将URL转换为域

时间:2014-02-23 05:42:56

标签: php regex

我有一个$urls数组,其中包含一些图片或其他任何内容的网址:

$urls = array("http://shop.google.com/pic/android2014-1.jpg",
"http://shop.about.com/pic/buy2.gif",
"http://shop.ebay.com/pic/android2014-2.jpg",
"http://shop.somesite.com/pic/android2014-3.jpg",
"http://shop.wordpress.com/pic/android2014-6.jpg",
"http://shop.test.com/pic/android2014-4.jpg");

我的输出需要像这样:

$domains = array("shop.google.com",
"shop.about.com",
"shop.ebay.com",
"shop.somesite.com",
"shop.wordpress.com",
"shop.test.com");

我找到了像this example这样的解决方案。它运行良好,但我想在我的foreach循环中使用正则表达式。我想我应该使用preg_math并阅读php.net文档,但我不知道如何使用regular expression

3 个答案:

答案 0 :(得分:3)

$domains=array();
foreach($urls as $url){
    $domain = parse_url($url, PHP_URL_HOST);
    array_push($domains,$domain);
}

您只需print_r($domains);即可打印域名。


使用正则表达式

preg_match("/^(http:\/\/)?([^\/]+)/i", $url, $matches);
$domain = $matches[2];

答案 1 :(得分:0)

功能风格:

$domains = array_map(function($url) { return parse_url($url, PHP_URL_HOST); }, $urls); 
var_dump($domains);

参见工作示例here

答案 2 :(得分:0)

试试这个:

preg_match("/(?<=http:\/\/)(.*?)(?=\/)/sm", $input_line, $output_array);

<强>解释

第一部分是使用正面lookbehind匹配“http://”之后的任何内容(google lookbehind and lookahead“以获取更多信息)。

(?<=http:\/\/)(.*?)

最后一部分使用正向前瞻来匹配/(文件夹)/(文件名)之前的任何内容.gif:

(?=\/)

结果: http://www.phpliveregex.com/p/3TZ


还要匹配https(或其他协议)

preg_match("/(?<=\w:\/\/)(.*?)(?=\/)/sm", $input_line, $output_array);

结果: http://www.phpliveregex.com/p/3U0