Проблема в получении всех URL-адресов на странице с помощью регулярных выражений? - PullRequest
0 голосов
/ 18 августа 2011

У меня есть исходный код веб-страницы, хранящийся в $ page, и мне нужно извлечь из него все URL

проблема в том, что некоторые URL-адреса находятся не в теге <a>, а в кодах 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>

, и я использую этот код регулярного выражения

$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 голосов
/ 18 августа 2011

Вместо сопоставления на <a href, попробуйте просто сопоставить по URL:

$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, onclick или просто текст.

РЕДАКТИРОВАТЬ: найдено лучшее регулярное выражение в http://daringfireball.net/2010/07/improved_regex_for_matching_urls

0 голосов
/ 18 августа 2011

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
*/
0 голосов
/ 18 августа 2011

В первом примере у вас есть:

<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>";

как вы видите, у вас есть href = в регулярном выражении

измените href = на onClick = и попробуйте, этот совет должен решить эту проблему.

если вам нужно использовать href и onClick (href | onClick)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...