我收到一条包含几个网址的文字。我想提取文本中给出的网址中存在的主机列表。例如:
INPUT:
www.jenniferlopezonline.com www.jenniferlopez.com www.twitter.com/jlo www.myspace.com/jenniferlopez www.youtube.com/jenniferlopez
期望的输出:
Array(
[0]=>www.jenniferlopezonline.com
[1]=>www.jenniferlopez.com
[2]=>www.twitter.com
[3]=>www.myspace.com
[4]=>www.youtube.com
);
我试过这段代码:
preg_match_all('/([a-z0-9\_\-]+(\.)[a-z0-9\_\.\-]+)/i',$text,$matches);
print_r($matches);
输出有点像这样:
Array
(
[0] => Array
(
[0] => www.jenniferlopezonline.com
[1] => www.jenniferlopez.com
[2] => www.twitter.com
[3] => www.myspace.com
[4] => www.youtube.com
)
[1] => Array
(
[0] => www.jenniferlopezonline.com
[1] => www.jenniferlopez.com
[2] => www.twitter.com
[3] => www.myspace.com
[4] => www.youtube.com
)
[2] => Array
(
[0] => .
[1] => .
[2] => .
[3] => .
[4] => .
)
);
在所需的输出中转换此输出将花费我更多的代码,这将使该过程变慢。我会批量获取数据,所以我买不起。
答案 0 :(得分:0)
只需删除不必要的括号即可。他们正在捕获首先生成附加阵列的组(以及引擎中昂贵的东西):
preg_match_all('/[a-z0-9\_\-]+(\.)[a-z0-9\_\.\-]+/i',$text,$matches);
这将在$matches[0]
中为您提供所需的数组,而不是立即在$matches
中,但无法更改该行为。此外,这已经为您节省了最多的计算开销。将$matches[0]
分配给$array
可能比较微不足道。
答案 1 :(得分:0)
您还可以尝试parse_url()
,它会为您提供网址组件的关联数组。
例如:
$parts = parse_url('http://twitter.com/jlo');
echo $parts['host'];
将打印twitter.com
。
确保您的网址包含http://
计划。