Regexp для извлечения всех ссылок и якорных текстов из HTML

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

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» и текст привязки «Тест 1», затем «http://example2.com» и «http://example2.com», Тест 2 'и т. Д.

 <? $dom = new DomDocument(); $dom->loadHTML($html); $urls = $dom->getElementsByTagName('a'); 

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

 <?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'; } ?> 
 <?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} } ?> 

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

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

 //not tested $regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/"; 
 /<a[^>]+href\s*=\s*["']([^"']+)["'][^>]*>(.*?)<\/a>/mis 

Что касается использования 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