За последние 24 часа нас посетили 17959 программистов и 1642 робота. Сейчас ищут 1286 программистов ...

помогите составить регулярное выражение для preg_match_all

Тема в разделе "Регулярные выражения", создана пользователем PHENIX53, 28 ноя 2010.

  1. PHENIX53

    PHENIX53 Активный пользователь

    С нами с:
    25 ноя 2010
    Сообщения:
    6
    Симпатии:
    0
    есть страничка с вот такой структурой:

    href="/projects/?pid=555285">
    Текст1
    </a>
    <div class="project-preview-desc"><p>
    Текст2
    </p>
    <div class="project-stats">
    Текст3
    </div>

    надо подоставать в массивы текст1, текст2 и текст3, число которое после pid= может меняться. у меня был код который достает текст между двумя указанными строчками, но я его потерял... помогите плиз примерчиком, т.к на пхп третий раз смотрю за всю свою програмерскую жизнь))
     
  2. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    /<p.*?>(.*?)<\/p>/i
    Как-то так... Но исходный текст у вас не валидный изначально.
     
  3. PHENIX53

    PHENIX53 Активный пользователь

    С нами с:
    25 ноя 2010
    Сообщения:
    6
    Симпатии:
    0
    то что не валидный это само собой, я ж повыкидывал все лишнее и оставил только те тэги между которыми текст нужно брать. Не совсем понятно ваше регулярное выражение... Вот как я все это понял, поправьте если что не так.
    /<p.*?> - это тэг <p>, понятно, только что значит .*? (подозреваю что любая последовательность символов)
    (.*?) - это текст который я достаю, опять же что такое .*? и что значат скобки?
    <\/p>/i - тэг </p>, тут я так понял, что \ нужна для экранирования /, а что такое i ? это описка?
     
  4. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    Объясняю: .*?
    точка — любой символ. Звёздочка — повторять 0 и более раз. Знак вопроса означает, что звёздочка будет заглатывать все символы до первого символа > (иначе звёздочка захватит все входные данные, это называется жадный квантификатор, ещё бывает ревнивый, читайте википедию)
    Скобки во втором случае означают, что выражение внутри скобок попадёт в карман, из кармана можно будет потом достать нужный текст.

    i — регистронезависимое сравнение. Читайте мануалы!
     
  5. PHENIX53

    PHENIX53 Активный пользователь

    С нами с:
    25 ноя 2010
    Сообщения:
    6
    Симпатии:
    0
    вот что я наваял с помощью preg_match_all, но почему-то ничего не выводиться :?
    PHP:
    1. <?php
    2. $file = fopen ("http://www.onliner.by/", "r");
    3. if (!$file) {
    4.     echo "<p>Unable to open remote file.\n";
    5.     exit;
    6. }
    7. $array1;
    8.  
    9. while (!feof ($file)) {
    10.     $line = fgets ($file, 1024);
    11.     preg_match_all ("/<p.*?>(.*?)<\/p>/i", $line, $array1);
    12. }
    13.  
    14. echo $array1[0][0];
    15. echo $array1[0][1];
    16.  
    17. fclose($file);
    18. ?>
     
  6. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    $c = file_get_contents("http://www.onliner.by/");
    preg_match_all ("/<p.*?>(.*?)<\/p>/i", $c, $array1);
    print_r($array1);
     
  7. Boston George

    Boston George Активный пользователь

    С нами с:
    1 дек 2010
    Сообщения:
    1
    Симпатии:
    0
    Помогите пожалуйста тоже вот с чем:
    Не могу составить регулярное выражение для preg_match.
    Делаю так:


    <?php
    $line='2,Abarth,1300 Scorpione Coupe,1968,,Rear,"1280 ccm (77,72 cubic inches)","in-line, 4-cyl",,"74.00 PS (53,72,64 kW or 72,64 HP) at 6000 Rev. per min."';
    if(preg_match('/^(.*),(.*),(.*),(.*),(.*),(.*),"(.*)","(.*)",(.*),"(.*)"$/',$line,$matches)){
    echo($matches[1].",".$matches[2].",".$matches[3].",".$matches[4].",".$matches[5].",".$matches[6].",".$matches[7].",".$matches[8].",".$matches[9].",".$matches[10].",".$matches[11].",".$matches[12]);
    }else{
    echo("error");
    }
    ?>


    "(.*)" не работает для "74.00 PS (53,72,64 kW or 72,64 HP) at 6000 Rev. per min.", то есть вот так


    <?php
    $line='2,Abarth,1300 Scorpione Coupe,1968,,Rear,"1280 ccm (77,72 cubic inches)","in-line, 4-cyl",';
    if(preg_match('/^(.*),(.*),(.*),(.*),(.*),(.*),"(.*)","(.*)",(.*)$/',$line,$matches)){
    echo($matches[1].",".$matches[2].",".$matches[3].",".$matches[4].",".$matches[5].",".$matches[6].",".$matches[7].",".$matches[8].",".$matches[9].",".$matches[10].",".$matches[11].",".$matches[12]);
    }else{
    echo("error");
    }
    ?>


    всё работает. Как обозначить текст "74.00 PS (53,72,64 kW or 72,64 HP) at 6000 Rev. per min." ?

    Причём вот так тоже работает:


    <?php
    $line='2,Abarth,1300 Scorpione Coupe,1968,,Rear,"1280 ccm (77,72 cubic inches)","in-line, 4-cyl",';
    if(preg_match('/^(.*),(.*),(.*),(.*),(.*),(.*),"(.*)","(.*)",(.*)$/',$line,$matches)){
    echo($matches[1].",".$matches[2].",".$matches[3].",".$matches[4].",".$matches[5].",".$matches[6].",".$matches[7].",".$matches[8].",".$matches[9].",".$matches[10].",".$matches[11].",".$matches[12]);
    }else{
    echo("error");
    }
    echo("<br/>");

    $line='"74.00 PS (53,72,64 kW or 72,64 HP) at 6000 Rev. per min."';
    if(preg_match('/^"(.*)"$/',$line,$matches)){
    echo($matches[1].",".$matches[2].",".$matches[3].",".$matches[4].",".$matches[5].",".$matches[6].",".$matches[7].",".$matches[8].",".$matches[9].",".$matches[10].",".$matches[11].",".$matches[12]);
    }else{
    echo("error");
    }
    ?>


    В чём же может быть дело?
    Я понял, тут ограничение на количество выражений. А можно ли его изменить?
     
  8. sunnyday

    sunnyday Новичок

    С нами с:
    24 янв 2014
    Сообщения:
    1
    Симпатии:
    0
    Re: помогите составить регулярное выражение для preg_match_a

    почему бы не сделать так?
    Код (Text):
    1. <?php
    2. $line='2,Abarth,1300 Scorpione Coupe,1968,,Rear,"1280 ccm (77,72 cubic inches)","in-line, 4-cyl",';
    3. $matches = explode(",", str_replace('"', '', $line2));
    4. ?>
    вроде и быстрее и вернее

    Код (Text):
    1. <?php
    2. $line='2,Abarth,1300 Scorpione Coupe,1968,,Rear,"1280 ccm (77,72 cubic inches)","in-line, 4-cyl",';
    3. if(preg_match('/^(.*),(.*),(.*),(.*),(.*),(.*),"(.*)","(.*)",(.*)$/',$line,$matches)){
    4. echo($matches[1].",".$matches[2].",".$matches[3].",".$matches[4].",".$matches[5].",".$matches[6].",".$matches[7].",".$matches[8].",".$matches[9].",".$matches[10].",".$matches[11].",".$matches[12]);
    5. }else{
    6. echo("error");
    7. }
    8. echo("<br/>");
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Re: помогите составить регулярное выражение для preg_match_a

    sunnyday, ты бы еще в 2020 написал бы. :D