Помогите с регэкспом выделения ссылок и разбор их

HelpFinder

Новичок
Помогите с регэкспом выделения ссылок и разбор их

Составил рег эксп, который должен выдёргивать все ссылки и выделять Url и текст ссылки. При этом не надо забывать, что ссылки могут содержаться теги, которые не должны попасть в результат.
preg_match_all("#(href=\s*([\"'])(.+?)\\2.*?>\s*(.*?)\s*</a>)|(href=\s*(.+?)((\s*>)|(\s.+?>))(.*?)\s*</a>)#i",$page,$arr_matches);

Вот такой составил. работает, но не во всех случаях. Может у кого есть готовый рецепт?
или хотябы рег эксп для выдергивания из строчки всех ссылок от <a до </a>
помогите. заваливаю проект.
 

WP

^_^
Мимо.
PHP:
<plaintext><?php
$pattern = '~<a.+?href\s*=(?:([\'"])(.*?)\1|\s*[^\s>]*).*?>(.*?)</a>~si';
$body = file_get_contents('http://phpclub.ru');
preg_match_all($pattern,$body,$matches,PREG_SET_ORDER);
$links = array();
foreach ($matches as $k=>$v)
{
 //$v[3] = strip_tags($v[3]);
 $links[] = array($v[2],$v[3]);
}
var_dump($links);
?></plaintext>
Проснулся несколько минут назад, для разминки мозгов)
 

HelpFinder

Новичок
Крутой скрипт! единственно - не работает, если на странице на одной из сылок забыли поставить закрывающий тег, то следующую ссылку он не воспринимает.
 

WP

^_^
Сорри, я реально не проснулся тогда, не предусмотрел.
PHP:
<plaintext><?php
$pattern = '~<a.+?href\s*=(?:([\'"])(.*?)\1|\s*([^\s>]*)).*?>(.*?)(?:</a>|(?=<a))~si';
$body = file_get_contents('http://phpclub.ru');
preg_match_all($pattern,$body,$matches,PREG_SET_ORDER);
$links = array();
foreach ($matches as $k=>$v)
{
 ///$v[4] = strip_tags($v[4]);
 $links[] = array(strlen($v[3])?$v[3]:$v[2],$v[4]);
}
//var_dump($matches);
var_dump($links);
?></plaintext>
Другое дело.
 

vasa_c

Новичок
DOM

loadHTML() - загрузка HTML-документа.
Дальше DOM-функциями спокойно находятся все тэги <A> и достаются из них любые аттрибуты и содержимое.
 

vasa_c

Новичок
PHP:
 $str = '<meta http-equiv="content-type" content="text/html; charset=windows-1251" />';
 for ( $i = 0; $i < 1000; $i++ )
   $str .= str_repeat( $i, 10 ).'<a href="./page'.$i.'.htm">Ссылка N'.$i.'</a>';
   
 print 'Длина обрабатываемой строки: '.strlen( $str ).'<br />';
 
 $m1 = microtime();
 $m2 = microtime();
 
 $m1 = microtime();
 preg_match_all( '~<a.+?href\s*=(?:([\'"])(.*?)\1|\s*([^\s>]*)).*?>(.*?)(?:</a>|(?=<a))~si',
                 $str, $matches, PREG_SET_ORDER );
 $m2 = microtime();
 
 $m1 = explode( ' ', $m1 );
 $m2 = explode( ' ', $m2 );
 print 'Регулярка: '.( ( $m2[ 0 ] + $m2[ 1 ] - $m1[ 0 ] - $m1[ 1 ] ) * 1000 ).' мс.<br />';
 
 $d = new domDocument;

 $m1 = microtime();
 $d->loadHTML( $str );
 $a = $d->getElementsByTagName( 'a' );
 $m2 = microtime();
 $m1 = explode( ' ', $m1 );
 $m2 = explode( ' ', $m2 );
 print 'DOM: '.( ( $m2[ 0 ] + $m2[ 1 ] - $m1[ 0 ] - $m1[ 1 ] ) * 1000 ).' мс.<br />';
Результат:
Длина обрабатываемой строки: 67756
Регулярка: 10.3771686554 мс.
DOM: 13.7519836426 мс.
Так что разница не велика.
 

HelpFinder

Новичок
Вопрос опять про эту регулярку
$pattern = '~<a.+?href\s*=(?:([\'"])(.*?)\1|\s*([^\s>]*)).*?>(.*?)(?:</a>|(?=<a))~si';

а как мне сузить условия поиска
Отобрать ссылки по конкретному началу адреса, т.е. допустим у нас домен moskow.ru и мы хотим выдрать все ссылки у которых адрес начинается на этот домен, притом домен может кроме moskow.ru начинатся и на www и на http:// и на htpp://www подскажите особенно вопрос к WP
 

Wicked

Новичок
выбрать все, сделать parse_url(), и фильтровать по ["host"] регуляркой типа /\bmoscow.ru$/?
 

HelpFinder

Новичок
просто там может быть такое что href="leviy_sayt.com\porno.php?cyty=moscov.ru...

мне кажется в регулярник както надо после href поставить проверку на www, http и потом чтобы было moscow.ru
 

Wicked

Новичок
Может быть, да.

Но мой фильтр это НЕ пропустит. Я так понимаю, что тебе было просто лень прочитать про parse_url().
 

WP

^_^
PHP:
$pattern = '~<a.+?href\s*=(?:([\'"])(?=http://moscov.ru)(.*?)\1|\s*([^\s>]*)).*?>(.*?)(?:</a>|(?=<a))~si';
 

WP

^_^
PHP:
$pattern = '~<a.+?href\s*=(?:([\'"])(?=http://(?:www\.)?moscov.ru)(.*?)\1|\s*([^\s>]*)).*?>(.*?)(?:</a>|(?=<a))~si';
 
Сверху