使用正则表达式获取页面中所有网址的问题?

时间:2011-08-18 11:35:22

标签: php regex curl

我有一个存储在$ page中的网页源代码,我需要从中提取所有网址

某些网址不在<a>标记但在javascript代码中的问题。

例如,我有这个源代码,我想从

中提取所有网址
    Click <a style="vertical-align:middle;cursor:pointer;text-decoration:underline;color:red;" onClick="return downme('http://www.AAAAA.com/atnbc1i7b/part1.html')">

            Here</a> to go to download page

<a href="http://www.UUUU.com/register">Hi all</a>

我使用这个正则表达式代码

$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
    if(preg_match_all("/$regexp/siU", $page, $matches, PREG_SET_ORDER))
               {
                 foreach($matches as $match)
                   {
                      print_r($match)
                   }

               }

输出将打印给我

http://www.UUUU.com/register

但另一个链接

http://www.AAAAA.com/atnbc1i7b/part1.htm

不会出现!!

请帮助

感谢

3 个答案:

答案 0 :(得分:0)

在第一个例子中,你有:

<a href="http://www.UUUU.com/register">

所以这个正则表达式工作

但在第二位:

<a style="vertical-align:middle;cursor:pointer;text-decoration:underline;color:red;" onClick="return downme('http://www.AAAAA.com/atnbc1i7b/part1.html')">

所以这不起作用,因为:

$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

如你所见,你在regexp中有href =

将href =更改为onClick =并尝试,此提示应解决此问题。

如果你需要href和onClick使用(href | onClick)

答案 1 :(得分:0)

不要在<a href上进行匹配,而只需在网址上进行匹配:

$regexp = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))"

由于目前缺乏设施,我没有对此进行测试,但是如果您通过它运行文件,它应匹配任何类似于URL的内容,无论是href还是{{1}或者只是在文本中。

编辑:在http://daringfireball.net/2010/07/improved_regex_for_matching_urls

找到了更好的正则表达式

答案 2 :(得分:0)

网址:全文查找(协议可选) 在没有http:或ftp:协议的情况下匹配www.domain.com和ftp.domain.com等网址。 最后一个字符类确保如果URL是某些文本的一部分,则URL后的标点符号(如逗号或句点)不会被解释为URL的一部分。

$html = <<< EOF
Click <a style="vertical-align:middle;cursor:pointer;text-decoration:underline;color:red;" onClick="return downme('http://www.AAAAA.com/atnbc1i7b/part1.html')">
Here</a> to go to download page
<a href="http://www.UUUU.com/register">Hi all</a>
EOF;

preg_match_all('/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $html, $urls, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($urls[0]); $i++) {
   echo  $urls[0][$i];
}

/* echo's :  
http://www.AAAAA.com/atnbc1i7b/part1.html
http://www.UUUU.com/register
*/