我有一个$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
答案 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);