Разбитие строки на подстроки(вопрос)

Discussion in 'PHP' started by Dark_Scorpicore, 10 Jun 2009.

  1. Dark_Scorpicore

    Joined:
    4 Apr 2009
    Messages:
    53
    Likes Received:
    8
    Reputations:
    0
    неактуально

    неактуально
     
    #1 Dark_Scorpicore, 10 Jun 2009
    Last edited: 3 Apr 2011
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Код покажи
     
    _________________________
    2 people like this.
  3. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    PHP:
    foreach(file('mail.txt') as $account)
    {
    $data=explode(':',$account);
    print_r($data);
    }
    Хз, что у тебя, юзай это.
     
  4. Zitt

    Zitt Elder - Старейшина

    Joined:
    7 May 2006
    Messages:
    736
    Likes Received:
    268
    Reputations:
    59
    <?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
     
  5. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    строку которую парсиш выложи
     
  6. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Вариант через руглярки
    PHP:
    $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>');
    }
     
    #6 FireFenix, 10 Jun 2009
    Last edited: 10 Jun 2009
  7. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    LEE_ROY, зачем строчка, если есть условие?
     
  8. diehard

    diehard Elder - Старейшина

    Joined:
    30 Sep 2007
    Messages:
    442
    Likes Received:
    266
    Reputations:
    15
    Code:
    preg_match_all("/(.+):(.+)/", file_get_contents("accs.txt"), $accs);
    
     
  9. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Ну вот 3 варианта обработки файла:
    PHP:
    <?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";
      }
    ?>
    В последнем случае надо б иметь в конце файла пустую строку
     
    #9 krypt3r, 10 Jun 2009
    Last edited: 10 Jun 2009
  10. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Читай внимательнее ! Все варианты уже выложили и они гораздо короче. А для регулярок я выкладывал, где можно без пустой последней строки!
     
    #10 FireFenix, 10 Jun 2009
    Last edited: 10 Jun 2009
    1 person likes this.
  11. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    ну если у человека не работает explode значед он что-то недоговаривает или недопонимает, из-за чего лучше увидеть строку, чем обьяснение, что сократит время на решение задачи и обьяснение ее словами. во как :)
     
  12. Dark_Scorpicore

    Joined:
    4 Apr 2009
    Messages:
    53
    Likes Received:
    8
    Reputations:
    0
    Спасибо всем за ответы

    А как обращаться к переменным в этом случае?

    Строка, которую парсю, выглядит так:

    mail@mail.ru:moipass
     
    #12 Dark_Scorpicore, 10 Jun 2009
    Last edited: 10 Jun 2009
  13. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Если кто не в теме - ачат почему - то режет это иногда. Юзер имел в виду mail@mail.ru:password.

    Dark_Scorpicore, я тебе написал, имхо, самый оптимальный вариант.
    Теперь с комментами:
    PHP:
    foreach(file('mail.txt') as $account# в цикле обрабатываем каждую строчку файла mail.txt

    $data=explode(':',$account); # разделяем мейл, пасс
    echo $data[0].' - login.'.$data[1].' - pass'# выводим даные

    #Мегахакерский скрипт by me
     
  14. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    перевод строки забыл, будет каша при выводе )
    зы ТС мне кажеться у тебя список идет без переноса строки user@mail.ru:pass?user@mail.ru:pass ? тогда нужно делать двойной explode по " : " по второму разделителю, что наврное есть пробел :confused:
     
  15. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    PHP:
    <?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>'); 


    ?>
    Если ты запустишь скрипт, то всё поймёшь наглядно :)
     
    #15 FireFenix, 10 Jun 2009
    Last edited: 10 Jun 2009
  16. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    лажа )
    если акки идут в одну строку через пробел, выдаст:
    group = user1@mail.ru:password1 user2@mail.ru:password2
    email = user1@mail.ru
    password = password1 user2@mail.ru:password2
     
  17. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    тогда так:
    PHP:
    $accounts=explode(' ',file_get_contetns('mails.txt'));
    foreach (
    $accounts as $account)
    {
    $var=explode(':',$account);
    print_r($var);
    }
     
  18. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Нада делать под конкретный случай! ИМХО :)
    Или прописывать "или" в разделителе регулярки '(\n|\r\n|\+|\#|\ |\*)'

    PHP:
    <?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>');  
    }  

    ?>
     
    #18 FireFenix, 10 Jun 2009
    Last edited: 10 Jun 2009
  19. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Народ, зачем усложнять задачу? Это простая строчка, разбивка которой может обойтись без регулярок.
    FireFenix, даже этот код можна сделать более оптимальным. Зачем использовать цикл
    PHP:
    for ($i 0$i count($match[0]); $i++) 
    если для работы с массивами предназначен цикл
    PHP:
    foreach()
     
    #19 mailbrush, 10 Jun 2009
    Last edited: 10 Jun 2009
  20. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Если сделать задачу на все случаи жизни, то регулярки правят миром :)
    foreach - да несомненно выведет всё что есть. Но ведь если мне нужна только первая группа выборки? или вторую присвоить/найти различия с другим массивам? тогда поэлементно может и не наглядно, зато практично