Регулярки на пхп

J
На сайте с 02.02.2009
Offline
53
#51

Слишком мало условий.

href='

href=

тем более может пожадничать и начать с первого a на странице и пройти до последнего href

DyaDya
На сайте с 11.04.2007
Offline
147
#52

В дополнение к своему посту:

Т.е. задачу я бы поставил так, найти все ссылки (вытащить url-ы) и анкоры в коде html, т.е. обрабатывать такие вещи:

<a href="url">анкор</a>

<a href='url'>анкор</a>

<a href=url>анкор</a> - url может быть путём с пробелами, но брать тогда нужно то, что до пробела.

<a opthref=ggg href=url target=blank>анкор</a> - т.е. наличие других параметров не должно мешать выборке url-ов

А если идти дальше, то тогда выборку вообще стоит разбить на две:

1. Поиск все ссылок с анкорами в валидных <a></a>, где параметр href указан в кавычках.

2. Поиск все ссылок без кавычек и помечать их как невалидные!

А дальше, кому нужно пущай с двумя массивами работает и делает то, что требуется. Можно и url и анкоры анализировать и т.п. Достаточно универсальная была бы регулярка или даже две. Пусть две регулярки, но главное, чтобы были попроще ;)

Отдельная выборка невалидных ссылок позволит потом пропарсить сайт и исправить их. Всё-таки нужно стремиться к правильному коду HTML.

Нашёл, что-то интересное (http://forum.php.su/topic.php?forum=4&topic=112):


<?PHP
// $body - строка из которой нужно выдирнуть ссылки
// $link[relative] относительные ссылки
// $link[absolute] абсолютные ссылки
preg_match_all('#<\s*?(a)(.|\n)*?(href)=(\'|\")(.|\n)*?<\/(a)>#i', $body, $links);
for ($i=0; $i<count($links[0]); $i++){
if(!preg_match('/<\s*?(a)(.|\n)*?(href)=(\'|\")(http)/i', $links[0][$i])) {$link[relative][]=$links[0][$i];}else{$link[absolute][]=$links[0][$i];}
}
?>
Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
[Удален]
#53

меня видимо уже игнорируют на этом форуме ..

вот самая правильная в смысле поиска и послед анализа регулярка. поверьте я делал например вот такую штуку http://seopro.com.au/free-seo-tools/link-checker/

вот регулярка на поиск ВСЕХ ССЫЛОК

preg_match_all('#<a[^>]*? href\s*=\s*(\S+?)[>\s]#ism',$txt,$links);
DyaDya
На сайте с 11.04.2007
Offline
147
#54
bearman:
меня видимо уже игнорируют...

Кто здесь?

p.s. Вас я уже запомнил ;) и записываю в блокнотик:

регурярка для поиска всех ссылок: preg_match_all('#<a[^>]*? href\s*=\s*(\S+?)[>\s]#ism', $txt, $links);

--

А выборка всех ссылок и анкоров до кучи, вот так?

preg_match_all('#<a[^>]*? href\s*=\s*(\S+?)[>](.*)<\/a>#ism', $txt, $links);

Наверное, есть ошипка, поправьте если что.

И похоже вот такую ссылку не словит ваша регулярка, <a href="http://site.ru/dir to file/index.php">

вроде как вытащит только http://site.ru/dir

[Удален]
#55

DyaDya, спасибо =))

она вернет результаты с КАВЫЧКАМИ. можно и от кавычек почистить, но мне и так хорошо, предпочитаю и ручками поработать немножко) зато она не монстроузная

DyaDya
На сайте с 11.04.2007
Offline
147
#56

Да, проверил, так и есть,

И похоже вот такую ссылку не словит ваша регулярка, <a href="http://site.ru/dir to file/index.php">
вроде как вытащит только http://site.ru/dir

Нашёл, офигительную регулярку


preg_match_all('#<(a|area)(\s+?[^>]*?\s+?|\s+?)href\s*=\s*(["\'`]*)\s*?([^>\s]+)\s*\3[^>]*?(/>|>(.*?)</\1>|>)#is', $txt, $links, PREG_SET_ORDER);

Сами ссылки как и у вас находит до пробела, но до кучи ещё и сами анкоры все вытаскивает.

И там же тоже работает:

preg_match_all("/<a.*?href=[\"\']?([^ >\"\']+)[\"\']?.*?>(.*?)<\/a>/si",$txt, $links);

Проверил, работает!

Bitman
На сайте с 05.07.2009
Offline
112
#57

засада номер 2

<textarea><a href="ссылка">sddd</a></textarea><xmp><a href="ссылка">sddd</a></xmp>

это к слову о том что всео не предусмотришь

Северный лес (https://euro-vagonka.by) DREW (https://drew.by) AvtoDrive (https://avtodrive.by)
DyaDya
На сайте с 11.04.2007
Offline
147
#58
Bitman:
засада номер 2
<textarea><a href="ссылка">sddd</a></textarea><xmp><a href="ссылка">sddd</a></xmp>

это к слову о том что всео не предусмотришь

☝ это точно!

Но если вам не нужны какие то блоки и вложенности тегов при анализе, то их можно предварительно удалить другой регуляркой!

Linkpusher
На сайте с 28.12.2007
Offline
176
#59

bearman,

'/<a\s+.*?href=[\"\']?([^\"\' >]*)[\"\']?[^>]*>(.*?)<\/a>/i'
?
Точу ножи. Буквально. Есть отзывы. Заказать заточку в МСК и Подольске можно через Телеграмм.
[Удален]
#60

DyaDya,

И похоже вот такую ссылку не словит ваша регулярка, <a href="http://site.ru/dir to file/index.php">
вроде как вытащит только http://site.ru/dir

а эта ссылка в принципе невалидна, я думаю что некоторые браузеры даже оттрактовать ее не смогут, хотя может я ошибаюсь)

bearman добавил 24.07.2009 в 23:57

toxic steel, .*? dyfчале замените на [^>]+?. на вопрос зачем - найдете ответы выше, не хочется в пятый раз переписывать статью)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий