我有一个包含网址和其他文字的字符串。我想将所有网址都放到$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文件中获取此字符串。
答案 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