Я хотел бы, чтобы одно или несколько регулярных выражений могли:
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