Regexp для извлечения всех ссылок и якорных текстов из HTML - PullRequest
3 голосов
/ 07 января 2011

Мне бы хотелось одно или несколько регулярных выражений, которые могут:

1) Возьмите HTML-код большой страницы.

2) Найдите URL-адреса, содержащиеся во всех ссылках, например:

<a href="http://example1.com">Test 1</a>
<a class="foo" id="bar" href="http://example2.com">Test 2</a>
<a onclick="foo();" id="bar" href="http://example3.com">Test 3</a>

И так далее, он должен извлечь URL, содержащийся в атрибуте 'href', независимо от того, что находится до или после href

3) Извлеките якорный текст из всех ссылок, например, в приведенных выше примерах он должен вернуть 'http://example1.com' и текст привязки' Test 1 ', затем' http://example2.com' и 'Test 2' и т. Д. .

Ответы [ 6 ]

7 голосов
/ 07 января 2011
<?

$dom = new DomDocument();
$dom->loadHTML($html);
$urls = $dom->getElementsByTagName('a');
5 голосов
/ 09 декабря 2013
<?php
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
if(preg_match_all("/$regexp/siU", $html, $matches, PREG_SET_ORDER))
{ foreach($matches as $match)
{// $match[2] = link address
// $match[3] = link text}
}
?>

Это извлечет как ссылку, так и текст привязки.

5 голосов
/ 07 января 2011

Вам нужно взглянуть на , посмотреть в будущее и оглянуться назад .

<?php

$string = '<a href="http://example1.com">Test 1</a>
<a class="foo" id="bar" href="http://example2.com">Test 2</a>
<a onclick="foo();" id="bar" href="http://example3.com">Test 3</a>';

if(preg_match_all("|<a.*(?=href=\"([^\"]*)\")[^>]*>([^<]*)</a>|i", $string, $matches))
        {
        /*** if we find the word white, not followed by house ***/
        echo 'Found a match';
        print_r($matches);
    }
else
        {
        /*** if no match is found ***/
        echo 'No match found';
        }
?>
2 голосов
/ 07 января 2011

Попробуйте что-то вроде этого:

//not tested
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
1 голос
/ 07 января 2011
/<a[^>]+href\s*=\s*["']([^"']+)["'][^>]*>(.*?)<\/a>/mis
0 голосов
/ 14 ноября 2013

Что касается использования RegEx для извлечения ссылок из HTML, этот чертовски надежен:

\b(((src|href|action|url) *(=|:) *(?<mh>"|'|))(?<url>[\w ~$!*'/.?=#&@:%+,();\-\[\]]+)\k<mh>|url *\( *(?<mc>"|'|)(?<url>[\w ~$!*'/.?=#&@:%+,();\-\[\]]+)\k<mc>\))

Вот тот, который извлекает весь «простой» текст (то есть содержимое внетеги) из документов HTML:

(<(?<tag>script|style)[\s\S]*?</\k<tag>>)|<!--[\s\S]*?-->|<[\s\S]*?>|(?<text>[^<>]*)

Проверьте их здесь: http://www.martinwardener.com/regex

...