[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос по регулярке <но не про форму
mika_di
Друзья знатоки, доброго времени суток!
Подскажите, пожалуйста, как правильно с помощью preg_match вытащить ссылку с сайта
сама ссылка
 
тут очень много всяких ссылок и текста бла бла бла...
это нужная ссылка
http://letitbit.net/download/90866.95fa0f5f6a7a43ac1e1dd0f92731/term_-_3.wmv.html
и тут тоже много всего понаписано уже ненужное

да, оговорюсь, что набор символов после http://letitbit.net/download/
может быть совершенно любой
вот мой корявый пример попытки вытащить ссылку самостоятельно
$extract_linck = htmlspecialchars(file_get_contents($str));
preg_match('#^(http\:\/\/letitbit\.net\/download\/*)$#',$extract_linck,$arr);
print_r($arr);

понятное дело у меня ничего не получилось, прошу указать на неправильности в составлении рег.выражения и показать, как правильно на примере вышеприведённой ссылки (ну просто, чтоб я понимал, как подобные вещи делаются)
Оговорюсь, читал довольно много информации о регулярных выражениях, вроде бы всё понятно, но на деле что-то не выходит.

Благодарю за помощь.



Спустя 6 минут, 45 секунд (22.08.2011 - 21:52) DySprozin написал(а):
mika_di
точку перед звездочкой поставь (;

Спустя 32 минуты, 47 секунд (22.08.2011 - 22:24) mika_di написал(а):
написал вот так
$extract_linck = htmlspecialchars(file_get_contents($str));
preg_match('#^(http\:\/\/letitbit\.net\/download\/.*)$#',$extract_linck,$arr);print_r($arr);


в ответ получил вот это Array ( )
может нужно, как-то более подробно ссылку раписать илиещё что, я признаться сегодян впервые так сказать на практике пользуюсь регулярками.

Спустя 9 минут, 59 секунд (22.08.2011 - 22:34) neadekvat написал(а):
Чтобы объяснить что-то языком регулярных выражений, сначала нужно понять самому.
Для начала, конечно, тебе нужена preg_match_all, т.к. preg_match используется для сравнения строк, а не для их поиска. Во-вторых, надо убрать символы начала и конца строки - почти по той же причине.
А затем надо подумать - как ты отличаешь ссылку от остального текста? Естесственно, если ты смотришь на исходный код (html).

Спустя 11 минут, 14 секунд (22.08.2011 - 22:46) mika_di написал(а):
Спасибо большое - с preg_match_all дело пошло веселее. Теперь разберусь...
единственное, хотелось бы узнать ещё, то, с чего нужный код начинается, я рзобрался и ,собственно, с этого места всё и вытащилось, но вот как указать то место, до которого нужно вытаскивать, иначе вся остальная страница(вернее код) вытаскивается? Подскажите, как указать границы вытаскивания, ну то есть то место, до куда вытаскивать.

Спустя 2 часа, 48 минут, 41 секунда (23.08.2011 - 01:34) Invis1ble написал(а):
Цитата
Подскажите, как указать границы вытаскивания, ну то есть то место, до куда вытаскивать.

ну по логике - до пробельного символа, тобишь до \s, либо \pZ для юникода

Спустя 10 часов, 28 минут, 14 секунд (23.08.2011 - 12:03) mika_di написал(а):
Ребят, а как указать окончание поиска-то, ну тоесть этот самый \s ну или (") что впринцепе мне бы подошло идеально.

Спустя 24 минуты, 47 секунд (23.08.2011 - 12:27) neadekvat написал(а):
Неспроста я сказал:
Цитата (neadekvat @ 22.08.2011 - 23:34)
А затем надо подумать - как ты отличаешь ссылку от остального текста?

В каждом тексте по своему можно определить окончание ссылки.
Например, в такой:
<a href="http://goto.ru?a=b&c=d#ef"></a>

Я смотрю: сам адрес начинается с http://goto.ru, а заканчивается кавычками. Значит, все, что до кавычек - часть ссылки. Достаю:
preg_match_all('#(http://goto\.ru[^"]+)#', $str, $out);

Проверяю:
print_r($out); В $out[1][0] искомая ссылка

Спустя 52 минуты, 29 секунд (23.08.2011 - 13:20) mika_di написал(а):
То есть в моём случае должно выглядеть примерно так.
preg_match_all('#(http\:\/\/letitbit\.net\/download\/.*[^"]+#',$extract_linck,$arr);

поскольку у меня должен прекратиться вывод данных при нахождении первого знака".
или я опять что-то не понял?
просто варианты искомой мной ссылки всередине всегда разные, точно никак не определишь какой набор символов будет после letitbit.net\download\ тут может быть всё, что угодно.html

Спустя 4 минуты, 50 секунд (23.08.2011 - 13:25) neadekvat написал(а):
Можно отталкиваться как раз-таки именно от "всё, что угодно.html". Т.е. в конец обязательно будет .html.

Спустя 1 час, 23 минуты, 58 секунд (23.08.2011 - 14:49) mika_di написал(а):
в итоге у меян заработал вот такой вот вариант
$extract_linck = htmlspecialchars(file_get_contents($str));
preg_match_all('#(http\:\/\/letitbit\.net\/download\/[90866]{1,}\.[0-9a-zA-Z]{1,}\/[a-zA-Z0-9_-]{1,}\.[]a-zA-Z0-9]{1,}\.html)#',$extract_linck,$arr);
echo "<a href='".$arr[1][0]."'>Ссылка на фильм</a>";

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

Спустя 5 минут, 25 секунд (23.08.2011 - 14:54) neadekvat написал(а):
Вместо {1,} лучше использовать +
Зачем экранировать всё? В твоем случаи (т.к. ограничители - #) нужно экранировать только точки.
[]a-zA-Z0-9]
Вот это для меня вообще загадка.

Спустя 10 минут, 54 секунды (23.08.2011 - 15:05) killer8080 написал(а):
Цитата (neadekvat @ 22.08.2011 - 22:34)
preg_match используется для сравнения строк, а не для их поиска.

и с чего бы это? preg_match используется для тех же целей, что и preg_match_all, с тем лишь отличием, что поиск останавливается на первом найденном вхождении. Если в документе есть только одна, искомая ссылка, то и preg_match будет достаточно.
$text = ' 
тут очень много всяких ссылок и текста бла бла бла...
это нужная ссылка
http://letitbit.net/download/90866.95fa0f5f6a7a43ac1e1dd0f92731/term_-_3.wmv.html
и тут тоже много всего понаписано уже ненужное'
;

preg_match('#http://letitbit\.net/download/.*\.html#i', $text, $match);

echo '<pre>'.print_r($match, 1).'</pre>';


UPD пардон провтыкал немного, подправил регулярку.

Спустя 7 минут, 45 секунд (23.08.2011 - 15:13) neadekvat написал(а):
killer8080, привычка перекрывает реальность.

Спустя 15 минут, 8 секунд (23.08.2011 - 15:28) mika_di написал(а):
Цитата (neadekvat @ 23.08.2011 - 11:54)
Вместо {1,} лучше использовать +
Зачем экранировать всё? В твоем случаи (т.к. ограничители - #) нужно экранировать только точки.
[]a-zA-Z0-9]
Вот это для меня вообще загадка.


Ну это я по неопытности понаписал, так сказать перестраховался))) забыв что если ограничители не / то экранировать их собственно и не надо, и с квантификатором + вместо {1,} ловко подсказал спасибо
в остальном думаю сносно написал.
А вот вариант с '#http://letitbit\.net/download/.*\.html#i' от killer8080 почему-то не сработал((( ну наверно я что-то нетак написал, хотя делал всё как у него.

З.Ы
Не по теме. Вообще мне тут нравится манера общения форумчан люди отзывчивые терпиливые, комнями в непонимающих не кидают, так что спасибо вам. очень сильно помогли в такой непростой теме как регулярки.

Спустя 9 минут, 30 секунд (23.08.2011 - 15:37) killer8080 написал(а):
Цитата (mika_di @ 23.08.2011 - 15:28)
А вот вариант с '#http://letitbit\.net/download/.*\.html#i' от killer8080 почему-то не сработал((( ну наверно я что-то нетак написал, хотя делал всё как у него.

Странно, у меня работал. Возможно дело в юникоде, добавь модификатор u
'#http://letitbit\.net/download/.*\.html#iu'

Спустя 9 минут, 25 секунд (23.08.2011 - 15:47) mika_di написал(а):
Конечный вариант шаблона
#(http://letitbit\.net/download/[\w\d]+\.[\w]+/[\w\d-]+\.[\w\d]+\.html)#


ну и думаю тему можно закрывать, ещё раз всем спасибо.

Спустя 21 час, 6 минут, 18 секунд (24.08.2011 - 12:53) mika_di написал(а):
Здраствуйте ещё раз. Рановато я тему зхакрыл, неуточнив один момент.
задача нужно вывести 10 нужных ссылок и вот код который призван это сделать
for($i = 0;$i <10; $i++);{
$page = "http://сайт/page/1/";
$extract_linck1 = htmlspecialchars(file_get_contents($page));
$str1 = $str1.$i;
preg_match_all('#(http://www.сайт.ru/под _каталог/[0-9]{1,6}[\w-]+\.html)#',$extract_linck1,$str1);
$str1 = $str1[1][0];
echo $str1;
}
Но выводится только одна ссылка, хотя и нужная... Оговорюсь, что ссылки эти похожи по своему строению, то есть шаблон регулярки хорошо под них подходит. не могу только заставить выводиться по нескольку штук на экран. Пожалуйста подскжите как дело поправить.

Спустя 1 час, 13 минут, 25 секунд (24.08.2011 - 14:06) neadekvat написал(а):
Цитата (mika_di @ 23.08.2011 - 16:28)
Вообще мне тут нравится манера общения форумчан люди отзывчивые терпиливые, комнями в непонимающих не кидают

Не со всеми. Увы, большинство приходит сюда за халявой - сделайте, напишите, покажите, но сами при этом думать отказываются. После нескольких десятков таких человек сложно к новичкам относитится де-факто положительно.

Цитата (mika_di @ 24.08.2011 - 13:53)
Но выводится только одна ссылка, хотя и нужная...

Я так понимаю, что выводится 10 раз одна и та же ссылка.
Ты ведь к одному адресу каждый раз обращаешься.

Спустя 4 минуты, 8 секунд (24.08.2011 - 14:11) mika_di написал(а):
не, выводилась одна но я это уже поправил путём
page = "http://сайт/page/1/";
$extract_linck1 = htmlspecialchars(file_get_contents($page));
$str1 = $str1.$i;
preg_match_all('#(http://www.сайт.ru/под _каталог/[0-9]{1,6}[\w-]+\.html)#',$extract_linck1,$str1);
foreach($str[1] as $link)
echo $link;

ну тут другая напсть на сайте откуда парсил ссыки на странице были продублированы и теперь выводится не
www.сайт.ru/page1
www.сайт.ru/page2
www.сайт.ru/page3 как хотелось бы
а вот так
www.сайт.ru/page1
www.сайт.ru/page1
www.сайт.ru/page2
www.сайт.ru/page2
www.сайт.ru/page3
www.сайт.ru/page3
то есть дублируются, и я не знаю как это поправить может чото подскажите?

Спустя 1 минута, 22 секунды (24.08.2011 - 14:12) neadekvat написал(а):
Попробуй прикрутить функцию array_unique().

Спустя 4 минуты, 28 секунд (24.08.2011 - 14:16) killer8080 написал(а):
$page = "http://сайт/page/1/";
$content = file_get_contents($page);
preg_match_all('#http://www.сайт.ru/под _каталог/[0-9]{1,6}[\w-]+\.html#',$content, $match);

$match = array_unique($match[0]);

foreach($match as $link){
echo $link . "<br />\r\n";
}


PS скобки в регулярке лишние и htmlspecialchars ни к чему.

Спустя 20 минут, 54 секунды (24.08.2011 - 14:37) mika_di написал(а):
Цитата (killer8080 @ 24.08.2011 - 11:16)
PS скобки в регулярке лишние и htmlspecialchars ни к чему.

приму к сведению

Спустя 1 час, 35 минут, 5 секунд (24.08.2011 - 16:12) mika_di написал(а):
всё заработало замечательно! спасио
Но я прошу прощения за глупый вопрос да и несовсем в тему, но вы не могли бы мне популярно (то есть для тупых) объяснить как работает
array_unique()
просто мануальные примеры по php мне несовсем доходчевы. вернее совсем не доходчевы..
Вот и получилось всё заработало, считай вы весь объём моей задачи выполнили а я не понял как работает ключевая фушкция, что она конкретно с массивами делает?

Спустя 9 минут, 7 секунд (24.08.2011 - 16:21) neadekvat написал(а):
http://php.net/manual/ru/function.array-unique.php
Тут ведь по-русски написано оО Да и по результату разве не понятно? Это очень, очень очевидные вещи. Их невозможно не понять, правда.

Спустя 9 минут, 55 секунд (24.08.2011 - 16:31) mika_di написал(а):
мда, и правда.... куда смотрел написано понятнее некуда.

Спустя 4 минуты, 1 секунда (24.08.2011 - 16:35) neadekvat написал(а):
mika_di, бывает smile.gif Возьми отдых хотя бы до утра.

Спустя 15 минут, 53 секунды (24.08.2011 - 16:51) mika_di написал(а):
Да пожалуй, ещё раз ребят огромное вам спасибо, проокачали вы меня. до этого реально пугался регулярок...

Спустя 14 часов, 16 минут, 38 секунд (25.08.2011 - 07:08) mika_di написал(а):
У меня ещё вопрос по по воду регулярных выраженийесли, например искомые мною ссылки бывают двух видов (хотя и те и другие нужные) просто написаны по разному. Ну просто раньше на сайте ссылки состовлялись по другому.
пример:
http://mysite.com/dow/90866.95fa0f5f6a7a43ac1e1dd0f92731/term_-_3.wmv.html
^
тут стоит точка вот она

http://mysite.com/dow/27888/0d956c65be1f3ec/term_-_4_.avi.html
^
а в этом варианте стоит /

я попробывал такой вариант
preg_match_all('#([симв.класс]\.[симв.класс]\.html)|([симв.класс]/[симв.класс]\.html)#',$input,$output);

но такой вариант не сработал. Пожалуйста подскажите почему?

Спустя 9 часов, 14 минут, 42 секунды (25.08.2011 - 16:23) mika_di написал(а):
Вопрос снимается сам разобрался)))) после / надо ставить + и тогда всё работает.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.