1

我有一个包含 URL 和其他文本的字符串。我想将所有 URL 放入$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);

上面的代码不会向我显示以下 URL:

cotry.lk 
newe.com 

你能举个例子告诉我,我怎样才能修改上面的代码来获取所有的 URL。

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

4

2 回答 2

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 代码。表达式最初是在互联网上找到并修改的。尽管此代码是用 Python 编写的,但您也可以轻松地在 PHP 中使用该表达式。

于 2013-04-27T12:59:29.693 回答
1

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

filter_var($url, FILTER_VALIDATE_URL)

如果它返回 true,你就知道它是一个有效的 url

于 2013-04-27T12:32:06.307 回答