0

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

输入:

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

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

4

2 回答 2

0

只需删除不必要的括号。他们正在捕获首先生成额外数组的组(以及引擎中昂贵的东西):

preg_match_all('/[a-z0-9\_\-]+(\.)[a-z0-9\_\.\-]+/i',$text,$matches);

这将为您提供所需的数组 in$matches[0]而不是立即 in $matches,但无法更改该行为。另外,这已经为您节省了最大的计算开销。分配$matches[0]$array可能可以忽略不计。

于 2012-11-10T22:28:49.037 回答
0

您也可以尝试parse_url()为您提供 URL 组件的关联数组。

例如:

$parts = parse_url('http://twitter.com/jlo');
echo $parts['host'];

将打印twitter.com

确保您的 URL 包含该http://方案。

于 2012-11-10T22:48:22.697 回答