从字符串中获取所有网址?

时间:2013-04-27 12:23:30

标签: php string

我有一个包含网址和其他文字的字符串。我想将所有网址都放到$matches数组中。但是以下代码不会将所有URL都放入$matches数组:

$matches = array();
$text = "words cotry.lk and newe.com joemiller.us schoollife.edu hello.net some random news.yahoo.com text http://tinyurl.com/9uxdwc some http://google.com random text http://tinyurl.com/787988 and others will en.wikipedia.org/wiki/Country_music URL";

preg_match_all('$\b[-A-Z0-9+&@#/%?=~_|!:,.;][.]*[-A-Z0-9+&@#/%=~_|(https?|ftp|file)://-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%?=~_|!:,.;]{8,50}$i', $text, $matches);
print_r($matches);

上面的代码不会显示以下网址:

cotry.lk 
newe.com 

请告诉我一个例子,如何修改上面的代码以获取所有网址。

请注意,并非所有网址都包含herf,并且不会从html文件中获取此字符串。

2 个答案:

答案 0 :(得分:2)

import re
def getall_urls(value):
    pattern = '((?:[\w\d]+\:\/\/)?(?:[\w\-\d]+\.)+[\w\-\d]+(?:\/[\w\-\d]+)*(?:\/|\.[\w\-\d]+)?(?:\?[\w\-\d]+\=[\w\-\d]+\&?)?(?:\#[\w\-\d]*)?)'
    # Place matches into list (a.k.a array)
    getall = re.findall(pattern, value) # preg_match_all() function in PHP
    # Remove duplicates and return the result
    return set(getall) if getall else ()

这是完全符合您需要的Python代码。 Expression最初是在Internet上发现并修改过的。尽管此代码是用Python编写的,但您也可以轻松地在PHP中使用该表达式。

答案 1 :(得分:1)

如果我是你,我不会使用preg_match_all,如果你想检查字符串是否有效地址。相反,我会将字符串切成单词并使它们变得艰难。

filter_var($url, FILTER_VALIDATE_URL)

如果它返回true,则表示它是一个有效的URL