
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
[x]
Дата
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Unregistered ![]() |
Всем привет.
Есть файлик html, там есть строка с таким содержанием: <span class="gen"><a href="/profile.php?mode=viewprofile&u=44964" style="color:" class="gen">Ильдар Ганиев</a> Мне надо через preg_match_all записать в файл только ник, как реализовать ? Пока получилось написать только: <?php Ошибок много. Заранее благодарен. Спустя 15 минут, 56 секунд (3.01.2012 - 15:45) inpost написал(а): Объясни, зачем слеш поставил после input ? input\ - зачем тут слеш? Слеш - это экранизация спец.символов, а где они? Спустя 2 минуты, 3 секунды (3.01.2012 - 15:47) Frost-56 написал(а):
Как видите input там не нужен вообще =) Спустя 3 минуты, 25 секунд (3.01.2012 - 15:50) inpost написал(а): Ну так исправь и напиши то, что нужно. Ато получается ты ничего не делал, сделал видимость работы дав вообще левый код. Нам то нужно, чтобы ты сам пошевелил извилинами, а если что-то не будет получаться, тогда и будем помогать. А если в регулярках не понимаешь, бери учебник Котерова и читай, нормально написано там. Тебе надо изучить "регулярные выражения" Спустя 3 минуты, 42 секунды (3.01.2012 - 15:54) inpost написал(а): А в целом, обычный вопрос тех, кто работает на регулярках: - Как экранизировать - Как создать (или|или) - Почему в данный код не находит то, что мне надо, ведь он, вроде, правильно написан. И для всех их нужно хотя бы палец об палец ударить и почитать о регулярках! Спустя 5 минут, 18 секунд (3.01.2012 - 15:59) Frost-56 написал(а): Я читал основы preg_match. Я попробовал сделать, отредактировал первый пост, посмотрите пожалуйста. Спустя 32 минуты, 46 секунд (3.01.2012 - 16:32) inpost написал(а): Кавычка не экранизирована в первом теге, закрытие ссылки тоже отсутствует, лишний пробел в конце. Внимательнее быть надо. Спустя 12 минут, 27 секунд (3.01.2012 - 16:45) Frost-56 написал(а): Изменил кроме закрытия ссылки. Ковычаками она закрыта же. И ещё, правильно ли я отметил то что в теге href ? там может быть любая ссылка просто и она мне не нужна. Спустя 24 минуты, 4 секунды (3.01.2012 - 17:09) inpost написал(а): Frost-56 У тебя так открытие второй ссылки идёт, а не закрытие первой. И что изменил, показывать надо. Спустя 13 минут, 8 секунд (3.01.2012 - 17:22) Frost-56 написал(а): Может подскажете где именно ? preg_match_all("/\<span class\=\"gen"\>\<a href\=\"(*)\" style\=\"color\:\" class\=\"gen\"\>(.*)\<a\>/U",$data,$mch, PREG_SET_ORDER); перед звездочкой надо воткнуть точку ? (.*) Спустя 3 минуты, 30 секунд (3.01.2012 - 17:25) m4a1fox написал(а): Frost-56 Корявенько конечно..... но работает! Вроде так как требовалось!
Спустя 1 минута, 4 секунды (3.01.2012 - 17:26) inpost написал(а): Тег а закрывается в конце так: </a> , а не так <a> Спустя 14 минут, 58 секунд (3.01.2012 - 17:41) Frost-56 написал(а): точно забыл про слеш. inpost спасибо, исправил, но все равно ошибка где то. m4a1fox на страницу выводит "Array ( [0] => Array ( ) [1] => Array ( ) )" а мне надо чтобы выводило только ник (в этом случае имя фамилия). Спустя 18 минут, 52 секунды (3.01.2012 - 18:00) m4a1fox написал(а): Frost-56 Код полностью в студию! И что возвращает вот эта строка $data = file_get_contents("тут ссылка на тот html"); -------------------------------------------------------------------------------------
Спустя 9 минут, 49 секунд (3.01.2012 - 18:10) Frost-56 написал(а): Через минутку. Сервер упал, может даже из за этого не работает. Спустя 7 минут, 5 секунд (3.01.2012 - 18:17) inpost написал(а): Кодировка того сайта, и кодировка твоего - точно ОДИНАКОВЫЕ? Спустя 36 минут, 29 секунд (3.01.2012 - 18:54) Frost-56 написал(а): Вот полный код: <?php Ошибка не исправилась. Спустя 4 минуты, 35 секунд (3.01.2012 - 18:58) inpost написал(а): Пробовал вывести red ? Кодировка точно одинаковая на обоих сайтах? Спустя 7 минут, 10 секунд (3.01.2012 - 19:05) m4a1fox написал(а): Frost-56 Чет явно не так. Сделай print_r($red) и давай что выведется на экран сюда. Спустя 2 минуты, 42 секунды (3.01.2012 - 19:08) Frost-56 написал(а):
кодировка одинаковая, на обоих сайтах windows-1251.
Если делать чтобы выводился red то он выводит сам сайт, а не результат поиска. Спустя 7 минут, 59 секунд (3.01.2012 - 19:16) m4a1fox написал(а): Frost-56
первая ошибка. ИМХО конечно, но скрипт ищет на utf-8 кажется. Спустя 1 минута, 38 секунд (3.01.2012 - 19:18) Frost-56 написал(а): И что предлагаете сделать ? ![]() Ведь очень много сайтов на cp1251 стоят. он выводит это: http://krirminala.net/ru/memb.php (тут скрипт) Спустя 24 минуты, 38 секунд (3.01.2012 - 19:42) inpost написал(а): m4a1fox если разные, то переводить надо. Frost-56 Попробуй сделать поиск более простой, сначало href="(.*)" с модификаторами isU Спустя 3 минуты, 24 секунды (3.01.2012 - 19:46) Frost-56 написал(а):
а можно примерчик, а то не понял нифига ))) Спустя 1 минута, 53 секунды (3.01.2012 - 19:48) inpost написал(а): Я тебе показал патерн, и модификаторы. Патерн поиска: href="(.*)" Модификаторы: isU Спустя 33 минуты, 58 секунд (3.01.2012 - 20:22) killer8080 написал(а): Frost-56 оно? $content = file_get_contents("http://krirminala.net/ru/kn.php"); Спустя 4 минуты, 35 секунд (3.01.2012 - 20:26) Frost-56 написал(а):
Спасибо большое. Взгляните http://krirminala.net/ru/memb.php Можно сделать чтобы выводились только ники ? Спустя 4 минуты, 44 секунды (3.01.2012 - 20:31) killer8080 написал(а):
А в чем проблема? В $match[1] у тебя и есть только ники ![]() Спустя 1 минута, 47 секунд (3.01.2012 - 20:33) inpost написал(а): В чём дело? Обращайся напрямую к $match[1]; Спустя 11 минут, 50 секунд (3.01.2012 - 20:45) Frost-56 написал(а):
Да вот не совсем. Вот скрипт с записью в txt: <?php Но в текстовик пишет слово Array и всё. Спустя 1 час, 7 минут, 41 секунда (3.01.2012 - 21:52) Winston написал(а): $content = file_get_contents("http://krirminala.net/ru/kn.php"); Спустя 2 минуты, 8 секунд (3.01.2012 - 21:54) Frost-56 написал(а): Смотрите что произошло в файле где Print, стало отображаться много лишнего исходника http://krirminala.net/ru/memb.php а в текстовик ничего не записалось. Спустя 6 минут, 12 секунд (3.01.2012 - 22:01) Winston написал(а):
А ты свое имя файла подставил ? ![]()
Спустя 2 минуты, 16 секунд Winston написал(а):
Ну, тогда оставь регулярку, которую предложил killer8080 preg_match_all('#<a[^>]+href="/profile.php\?mode=viewprofile[^>]+>(.*)</a>#isU', $content, $match); Спустя 3 минуты, 13 секунд (3.01.2012 - 22:04) Frost-56 написал(а): ![]() ![]() Спасибо большое за помощь. Спустя 3 часа, 21 минута, 19 секунд (4.01.2012 - 01:25) Frost-56 написал(а): Ещё 3 вопросика образовалось. Как сделать проверку на количество найденных ников ? думал сделать типа: if ($match[1] == str(60)) { ... } else { ... } второй вопрос по циклам: $i = '12000'; как приплюсовать число допустим 40 к 12000 так чтобы в переменной $i число изменилось на 12040 ? И последний вопрос : Как сделать так чтобы ники которые уже есть, не записывались ? Спустя 2 минуты, 11 секунд (4.01.2012 - 01:27) Winston написал(а):
echo sizeof($match[1]);
$i = 12000;
Ну это уже более сложно. Нужно проверки всякие делать... Спустя 2 минуты, 54 секунды (4.01.2012 - 01:30) Frost-56 написал(а):
Это значит сделать так ? $per = sizeof($match[1]); Верно ?
А это не катит, мне надо чтобы в сам файл где переменная $i вносились изменения. Т.к. я один раз использую скрипт, мне надо будет при следующем использовании уже делать $i = 12040; $i += 40; и так много раз, каждый раз изменять вручную не вариант. Спустя 27 минут, 3 секунды (4.01.2012 - 01:57) killer8080 написал(а):
удалить их из массива $match[1] = array_unique($match[1]); Спустя 7 минут, 57 секунд (4.01.2012 - 02:05) Winston написал(а):
Хм...killer8080 натолкнул на мысль :) . Вот так можно $file = file('file.txt'); // Твой файл с никами Спустя 6 минут, 31 секунда (4.01.2012 - 02:12) Frost-56 написал(а): Winston запись повторяющихся ников ведется по прежнему =( Спустя 2 минуты, 10 секунд (4.01.2012 - 02:14) killer8080 написал(а): Winston или так file_put_contents("file.txt", implode("\n", array_unique(array_merge($match[1], file("file.txt"))))); Спустя 2 минуты, 45 секунд (4.01.2012 - 02:17) Frost-56 написал(а): killer8080 ошибку выкидывает Спустя 1 минута, 43 секунды (4.01.2012 - 02:18) Winston написал(а):
Какую ? Спустя 18 секунд (4.01.2012 - 02:19) killer8080 написал(а): Frost-56 исправь так, как сейчас. Я там скобку в конце одну пропустил. ![]() Спустя 2 минуты, 17 секунд (4.01.2012 - 02:21) Frost-56 написал(а):
заработал, но все равно продолжает дописывать одинаковые ники. Спустя 1 минута, 5 секунд (4.01.2012 - 02:22) killer8080 написал(а):
Да ну ![]() Покажи код целиком. Спустя 31 секунда (4.01.2012 - 02:22) Frost-56 написал(а): <?php Спустя 3 секунды (4.01.2012 - 02:23) inpost написал(а): Frost-56 То есть тебе надо проверить, есть ли в файле ник, и если есть - не дописывать? Спустя 34 секунды (4.01.2012 - 02:23) Frost-56 написал(а): inpost, верно. Спустя 1 минута, 39 секунд (4.01.2012 - 02:25) inpost написал(а): Вообще логины хранить надо в БД, а не на файлах. Потому что на файлах - геморой. Спустя 2 минуты, 3 секунды (4.01.2012 - 02:27) Frost-56 написал(а): Да не подумал что то сразу. Если другого варианта не получится, придется через бд делать. Спустя 1 минута, 22 секунды (4.01.2012 - 02:28) inpost написал(а): Ещё не поздно. Не изобретай велосипед. БД существуют для того, чтобы облегчить работу такую, как у тебя. + БД - это и есть хранение данных на файлах, но в миллионы раз удобнее. Так что на твоём уровне лучше сразу выбрать правильный путь, а не загонять себя в яму. Спустя 3 минуты, 21 секунда (4.01.2012 - 02:32) killer8080 написал(а): Frost-56 исправил $content = file_get_contents("http://forum.kriminala.net/memberlist.php?mode=joined&order=ASC&start=40000"); Но inpost конечно дело говорит, на счет БД Спустя 1 минута, 44 секунды (4.01.2012 - 02:33) Frost-56 написал(а): killer8080, спасибо большое Спустя 5 минут, 9 секунд (4.01.2012 - 02:38) Frost-56 написал(а): А как быть ещё с 2 вопросами ?
Это значит сделать так ? $per = sizeof($match[1]); Верно ?
А это не катит, мне надо чтобы в сам файл где переменная $i вносились изменения. Т.к. я один раз использую скрипт, мне надо будет при следующем использовании уже делать $i = 12040; $i += 40; и так много раз, каждый раз изменять вручную не вариант. Спустя 2 минуты, 39 секунд (4.01.2012 - 02:41) inpost написал(а): Frost-56 Вопросы заново повтори. Спустя 1 минута, 9 секунд (4.01.2012 - 02:42) Frost-56 написал(а):
Спустя 9 секунд (4.01.2012 - 02:42) Winston написал(а):
Ну можно же было проверить ![]() Да верно. Спустя 34 секунды Winston написал(а):
Может сессии ? Спустя 1 минута, 9 секунд (4.01.2012 - 02:43) killer8080 написал(а):
вообще не понял, что ты пытаешься сделать? Спустя 17 секунд (4.01.2012 - 02:44) inpost написал(а): Frost-56 $i = $i + 40; Спустя 1 минута, 29 секунд (4.01.2012 - 02:45) Frost-56 написал(а): Winston можно и сессиями, только я не работал ещё с ними ![]() Спустя 3 минуты, 23 секунды (4.01.2012 - 02:49) killer8080 написал(а):
А что там с ними работать то? В начале скрипта session_start(), а потом работаешь с массивом $_SESSION. Спустя 24 минуты, 2 секунды (4.01.2012 - 03:13) Frost-56 написал(а): Вообщем щас почитал мануалы, ток я что то неправильно делаю. Вот как бы то что у меня получилось: <?php или не надо убивать сессию в конце ? Спустя 1 минута, 8 секунд (4.01.2012 - 03:14) inpost написал(а): Frost-56 Убить - это её очистить. А зачем? Спустя 2 минуты, 24 секунды (4.01.2012 - 03:16) Frost-56 написал(а): Так, ага, спс, а выгружать тоже не надо unset($_SESSION['id']);? На данный момент такой код: session_start(); но он почему то не работает =( Спустя 11 часов, 51 минута, 17 секунд (4.01.2012 - 15:07) Frost-56 написал(а): Поможет кто ? Спустя 15 минут, 47 секунд (4.01.2012 - 15:23) Winston написал(а): А так? $_SESSION['id'] += 40; Спустя 5 минут, 44 секунды (4.01.2012 - 15:29) killer8080 написал(а): Frost-56 тогда уж как то так session_start(); Спустя 1 минута, 9 секунд (4.01.2012 - 15:30) Frost-56 написал(а): Так нельзя, ошибку будет если $_SESSION['id'] будет в ссылке, поэтому переменной делал Спустя 12 минут, 10 секунд (4.01.2012 - 15:42) Winston написал(а):
Ну дык так напиши $content = file_get_contents("http://forum.kriminala.net/memberlist.php?mode=joined&order=ASC&start=" . $_SESSION['id']); Или так $content = file_get_contents("http://forum.kriminala.net/memberlist.php?mode=joined&order=ASC&start={$_SESSION['id']}"); Спустя 13 минут, 58 секунд (4.01.2012 - 15:56) Frost-56 написал(а): спс, но не пойму где ошибка. Выводит пустой экран после того как сделал if ($per >= 80) если сделать if ($per == 60) То работает. вот весь код: <?php Спустя 2 минуты, 50 секунд (4.01.2012 - 15:59) Winston написал(а): А какое число находится в $per? Напиши echo $per; Спустя 5 минут, 7 секунд (4.01.2012 - 16:04) Frost-56 написал(а): 80 пишет Спустя 8 минут, 20 секунд (4.01.2012 - 16:13) killer8080 написал(а): Frost-56 для начала зайди сюда, и почитай о стиле кодирования. Твой код, с фигурными скобками в один столбик, совершенно не читабельный. Представь что будет когда начнешь писать код на порядок сложнее? Чтобы легче было искать ошибки, да и вообще читать код, нужно сразу учится хорошему стилю ![]() Спустя 3 минуты, 1 секунда (4.01.2012 - 16:16) Winston написал(а):
Табуляторы... ![]() Спустя 18 минут, 44 секунды (4.01.2012 - 16:34) Frost-56 написал(а): Изменил код как смог, а теперь вы можете помочь мне с проблемой ? Спустя 8 минут, 28 секунд (4.01.2012 - 16:43) killer8080 написал(а):
Ну а чего ты ждал? Внимательно посмотри на свой код. if ($per >= 80) { У тебя выполняется условие, при этом происходит инкремент переменной, и всё. Запрос будет выполнен, только если не выполнено условие. Какой смысл в этом коде? Спустя 23 минуты, 8 секунд (4.01.2012 - 17:06) Frost-56 написал(а): Смысл в том что, если количество записей больше или равно 80 мы добавляем в переменную ещё +80 и страница запроса меняется, а если не больше или не равно количество записей 80 то выполняем выдираем ники и делаем запись в файл. только до сих пор не могу понять что не так с кодом, вроде правильно написано. Спустя 8 минут, 3 секунды (4.01.2012 - 17:14) killer8080 написал(а):
да все не правильно. Зачем тебе нужна сессия в этой задаче? Ты же хочешь просто сграбить все ники? Или что? Спустя 9 минут, 19 секунд (4.01.2012 - 17:23) Frost-56 написал(а): да чтобы он грабил постоянно ники, скрипт будет запускаться сам через некоторое время и грабить постоянно, например раз в сутки, поэтому другого варианта не вижу. Спустя 4 минуты, 9 секунд (4.01.2012 - 17:27) killer8080 написал(а):
А что мешает сграбить их все за один раз? Спустя 1 минута, 31 секунда (4.01.2012 - 17:29) Frost-56 написал(а):
новые ники на этом сайте часто добавляются и мне надо грабить их сразу как они появились. Спустя 8 минут, 10 секунд (4.01.2012 - 17:37) killer8080 написал(а):
Ну так +80 ты делаешь для выбора следующей страницы? Не лучше ли сразу одним заходом прочитать все страницы с никами? К тому же сессии тебе не помогут, если скрипт запускать кроном ![]() Спустя 4 минуты, 44 секунды (4.01.2012 - 17:42) Frost-56 написал(а):
Как вы предлагаете это сделать ? (мне нужны ники только с последних 3х страниц для начала, а потом ловить новые ники и просто добавлять их). Ведь надо сделать чтобы он постоянно драл ники. Спустя 9 минут, 29 секунд (4.01.2012 - 17:51) killer8080 написал(а):
Читать страницы циклом, все что есть. В первый раз. Последующие читаешь кроном раз в день. Уже только последнюю страницу. Спустя 1 минута, 50 секунд (4.01.2012 - 17:53) Frost-56 написал(а): Так я и хочу так. Последняя страница будет читаться до тех пор пока не будет 80 ников, а как будет 80 будет переход на другую страницу и и начнем копировать её пока не соберется опять 80 ников Спустя 9 минут, 4 секунды (4.01.2012 - 18:02) killer8080 написал(а): Frost-56 накидал вариант, попробуй set_time_limit(0); Спустя 31 минута, 28 секунд (4.01.2012 - 18:34) Frost-56 написал(а): Спасибо, отличный рабочий скрипт. Только он копирует все ники самого начала, в результате чего слишком большой файл и долго идет обработка, а мне бы просто с 3й страницы с конца начать. И можно ли будет запускать этот скрипт кроном ? Спустя 18 минут, 53 секунды (4.01.2012 - 18:53) inpost написал(а): Frost-56 "долго", вот поэтому и используют БД. Спустя 1 час, 52 минуты, 19 секунд (4.01.2012 - 20:45) killer8080 написал(а):
В отличие от твоих попыток с сессиями, можно. Скрипт ни к чему не привязан, и может без проблем работать в CLI режиме.
А что нужны были не все? Ну подставь в $i в начале не 0, а число соответствующее 3 странице с конца, делов то. ![]() Можно пойти дальше, и отлавливать офсет из ссылки на последнюю страницу, в пагинации. Тогда вместо слепого перебора в цикле while, можно будет использовать цикл for, проще будет отлавливать последние 3 страницы. Спустя 2 часа, 30 минут, 49 секунд (4.01.2012 - 23:16) Frost-56 написал(а):
число равное 3й странице 44000, поставил. В итоге, он начал копировать хрен пойми откуда (с 300+ страницы) и дошел до 502 bad getway. ![]() Спустя 4 минуты, 47 секунд (4.01.2012 - 23:21) killer8080 написал(а):
третьей странице с конца соответствует число 44080, это 552 страница. Хочешь сказать он начал копировать с 300-х?
А как ты об этом узнал? Покажи код. Спустя 1 минута, 40 секунд (4.01.2012 - 23:22) Frost-56 написал(а): страница запуска скрипта: http://krirminala.net/ru/memb.php файл для получения данных: http://krirminala.net/ru/text.txt (очистил) Код: <?php Спустя 17 минут, 11 секунд (4.01.2012 - 23:39) killer8080 написал(а): Frost-56 проверил, работает! Единственное ругается в начале из-за попытки открыть не существующий файл, исправил set_time_limit(0); Спустя 4 минуты, 24 секунды (4.01.2012 - 23:44) Frost-56 написал(а): круто, огромное Вам спасибо ![]() посталю + как пройдет это
Спустя 17 минут, 51 секунда (5.01.2012 - 00:02) Frost-56 написал(а): Ещё вопрос по cron. Я пользуюсь услугами известного хостинга. Как мне настроить запуск через cron своего скрипта, ведь доступа к серверу я не имею. Или есть какие то альтернативные варианты запуска скрипта в определенное время без участия пользователя ? Спустя 3 минуты, 40 секунд (5.01.2012 - 00:05) killer8080 написал(а): Frost-56 на всех платных хостингах есть крон, возможно и на многих бесплатных. Обычно он доступен через панель управления хостингом, если конечно, не предоставляется SSH доступ. В крайнем случае можно обратится в саппорт хостера. ![]() Спустя 15 минут, 41 секунда (5.01.2012 - 00:21) Frost-56 написал(а): Использую только платные, имхо более устойчивые, функциональные и надежные. Нашел там эту ф-цию, ещё раз спасибо. Это сообщение отредактировал Frost-56 - 3.01.2012 - 18:50 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
![]() |
![]() ![]() ![]() |