как отпарсить?

Discussion in 'PHP' started by x88x, 27 Mar 2008.

  1. x88x

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

    Joined:
    27 Nov 2007
    Messages:
    208
    Likes Received:
    119
    Reputations:
    16
    блин, совсем меня штырит =)

    вобщем, простенькая задачка: есть файл вида:
    HTML:
    <p>вопрос1</p>
    <p>ответ1</p>
    <p>ответ2</p>
    <p>ответ3</p>
    <p>ответ4</p>
    <p>ответ5</p>
    <img>
    <hr>
    <p>вопрос2<p>
    <p>ответ1<p>
    <p>ответ2<p>
    <p>ответ3<p>
    <hr>
    нужно с помощью пхп привести его в вид:
    вопрос1|ответ1|ответ2|ответ3........
    вопрос2|ответ1|ответ2|ответ3........

    и т.д.
    в долгу не останусь ;)
     
    1 person likes this.
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Можно на Delphi реализовать
     
  3. x88x

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

    Joined:
    27 Nov 2007
    Messages:
    208
    Likes Received:
    119
    Reputations:
    16
    блин. в принципе, не принципиально, но хотелось бы на пхп :rolleyes:
     
    1 person likes this.
  4. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    если в вопросе всегда есть знак вопроса '?', то можно взять все ~<p>([^<]*\?)</p>~ будут вопросы, а ~<p>([^<?]*)</p>~ - ответы
     
    1 person likes this.
  5. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Если текст именно такой, то можно в принципе просто заменой распарсить...но лучше конечно по регулярке...
    PHP:
    <?php
    $a 
    '<p>вопрос1</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <p>ответ4</p> <p>ответ5</p> 
    <img> <hr> <p>вопрос2</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <hr>'
    ;

    $a str_replace('<p>'' '$a);
    $a str_replace('</p>''|'$a);
    $a str_replace('<hr>'"\n"$a);
    $a strip_tags($a);
    echo 
    $a;
    ?>
    Ещё раз повторю что имхо лучше регуляркой, а то щас умники будут возникать...
     
    1 person likes this.
  6. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Толком не понял, как должен выглядеть результат, нужно по тегу <hr> раздулять ещё на строки? А тег <img> к чему? И почему во второй части заданного тс примера теги <p> не закрывающиеся в конце строк?

    Сделал как понял и первое, что пришло в голову :)

    PHP:
    $txt="<p>вопрос1</p>\n<p>ответ1</p>\n<p>ответ2</p>\n<p>ответ3</p>\n<p>ответ4</p>\n<p>ответ5</p>\n<img>\n<hr>\n<p>вопрос2</p>\n<p>ответ1</p>\n<p>ответ2</p>\n<p>ответ3</p>\n<hr>";


    $txt=str_replace('</p>','',$txt);
    $txt=str_replace('<img>','',$txt); //не понял, зачем <img>, удаляем
    $txt=str_replace("\n",'',$txt);

    $txt=explode('<hr>',$txt);

    $ans='';

    foreach(
    $txt as $txt2)
    {
      
    $txt2=explode('<p>',$txt2);

      foreach(
    $txt2 as $txt3)
      {
        if(
    $txt3$ans.=$txt3.'|';
      }

      
    $ans.="\n";
    }

    print_r($ans);
    Хотя если б было точнее условие, написал бы регулярку наверно)
     
    #6 d_x, 27 Mar 2008
    Last edited: 27 Mar 2008
    1 person likes this.
  7. VDShark

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

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    что б особо не извращаться с составлением выражения можн распарсить в два подхода... код ниже
    PHP:
    <?php
        $str 
    file_get_contents('1.txt');
        
    $pattern "!(.+)<hr>!Uis";
        
    preg_match_all($pattern$str$res);
        
    $pattern "!<p>(.+)</p>!Uis";
        foreach(
    $res[1] as $row){
            
    preg_match_all($pattern$row$tmp);
        }
    в результате на каждой итерации в массиве $tmp будет 0-й элемент - это вопрос, остальные - ответы.
     
    1 person likes this.
  8. x88x

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

    Joined:
    27 Nov 2007
    Messages:
    208
    Likes Received:
    119
    Reputations:
    16
    всем огромное спасибо!!! выручили как всегда =)
    проставлюсь завтра (Вы добавили слишком много репутации...)

    =)
     
  9. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    PHP:
    <?php
    $ff 
    file_get_contents('a.htm');
    $a explode("<hr>",$ff);
    $a preg_replace('/\r\n/'''$a);
    $a preg_replace('/<p>([^<]*)<\\/p>/''$1|'$a);
    $a preg_replace('/<[\/\!]*?[^<>]*?>/'''$a);
    for (
    $i 0$i count($a); $i++){
        echo 
    substr($a[$i], 0, -1)."<BR>\r\n";
    }
    ?>
     
    1 person likes this.
  10. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    блин..не успел:(
     
    2 people like this.
  11. x88x

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

    Joined:
    27 Nov 2007
    Messages:
    208
    Likes Received:
    119
    Reputations:
    16
    все равно спасибо =)
    радует такое количество помогающих ;)
     
    1 person likes this.
  12. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Йа извращенец =/
    PHP:
    <?php
    $a 
    '<p>вопрос1</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <p>ответ4</p> <p>ответ5</p>
    <img> <hr> <p>вопрос2</p> <p>ответ1</p> <p>ответ2</p> <p>ответ3</p> <hr>'
    ;

    $arr explode('<hr>'$a);
    for(
    $i=0$i<count($arr); $i++)
    {
       
    $str explode(' 'strip_tags(trim($arr[$i])));
       echo 
    implode('|'$str).'<br/>';
    }
    ?>
     
    5 people like this.