Php 使用正则表达式获取页面中的所有URL时出现问题?

Php 使用正则表达式获取页面中的所有URL时出现问题?,php,regex,curl,Php,Regex,Curl,我有一个网页源代码存储在$page中,我需要从中提取所有URL 问题在于有些URL不在标记中,而是在javascript代码中 例如,我有一个源代码,我想从中提取所有URL Click <a style="vertical-align:middle;cursor:pointer;text-decoration:underline;color:red;" onClick="return downme('http://www.AAAAA.com/atnbc1i7b/part1.html

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

问题在于有些URL不在标记中,而是在javascript代码中

例如,我有一个源代码,我想从中提取所有URL

    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>
但另一个环节

http://www.AAAAA.com/atnbc1i7b/part1.htm
不会出现

请帮忙


感谢您在第一个示例中:

<a href="http://www.UUUU.com/register">
所以这个regexp有效吗

但在第二种情况下:

<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而不是在

URL上进行匹配:在全文协议中查找可选 匹配URL,如www.domain.com和ftp.domain.com,但不使用http:或ftp:协议。 最后一个字符类确保,如果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
*/

您需要为regexp使用除/之外的分隔符,否则它将被切断。另一种选择是避开每一个反斜杠。例如,preg_match_all$regexpsiU,$page,$matches,preg_SET_ORDER
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
$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`!()\[\]{};:'\".,<>?«»“”‘’]))"
$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
*/