让主机脱离文本的完整网址列表

时间:2012-11-10 22:26:44

标签: php regex

我收到一条包含几个网址的文字。我想提取文本中给出的网址中存在的主机列表。例如:

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] => .
)
);

在所需的输出中转换此输出将花费我更多的代码,这将使该过程变慢。我会批量获取数据,所以我买不起。

2 个答案:

答案 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://计划。