[Регулярки & Mod_Rewrite] Задай вопрос, получи ответ.

Discussion in 'PHP' started by .:EnoT:., 19 Nov 2008.

Thread Status:
Not open for further replies.
  1. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    "Прежде чем что-то, кому-то советовать, проверяйте все таки это у себя."

    ыыыы, во-во, вот и проверь-те:

    PHP:
    <?
    $in
    '<div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext1 
            </div> 
            <div class="c2"> 
                sometext2 
            </div> 
        </div> 
    </div> 
    <div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext3 
            </div> 
            <div class="c2"> 
                sometext4 
            </div> 
        </div> 
    </div>'
    ;


    if (
    preg_match_all('/<div class="a1">(.*)<\/div>/s'$in$result)) 
    echo 
    'Оле!'"\r\n"; else echo 'Нету такого';
    print_r ($result);
    ?>
    ЗЫЖ Чем дальше в лес, тем глубже человек загоняет себя в задницу:)

    Пуся, я всегда и абсолютно всё проверяю, прежде чем сюда выкладывать:)
     
  2. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    2Gifts
    PHP:
    '~<div class="\w\d">((?:[^<>]+|(?R))*)</div>~si'
     
    1 person likes this.
  3. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    ))) И? Вы чо тут, сговорились что ли?:))) В итоге все равно раздельных значений нет:))))))) Все равно explode применять:))) И если сделать:

    PHP:
    $t explode("\r\n"$result[0][0]);
    print_r ($t);
    То там те же пустые строки присутствуют, да еще только первых двух значений:)

    А моя регулярка в разы проще, и, что самое главное, корректней
     
    #103 Pashkela, 17 Dec 2008
    Last edited: 17 Dec 2008
    1 person likes this.
  4. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Показываешь своё незнание?
     
  5. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    а по делу? Гы-гы просто

    ЗЫЖ Продолжаем разговор. Сами запустите свой скрипт хоть разок и посмотрите, чо там, где да как

    ЗЗЫЫЖЖ Я в шоке сегодня с некоторых доселе уважаемых мною личностей

    PS: И еще, чтобы безосновательно не тыкать в меня пальцем и не кричать "ОН ЛАМО!" (я не знаю, может у тебя любовь там с Gifts или еще что) может выложим готовый код по решению задачи Gifts-а именно в том ручье, в котором он думает, оно ему надо? Не просто регулярку какую-то взятую с неба и абсолютно бестолковую на мой взгляд, а код, от А до Я, как у меня? Тогда и сравним, чей код быстрей, правильней и оптимальней:) Пока я тут наблюдаю только один рабочий код - а именно свой. Со всем риспектом и etc.
     
    #105 Pashkela, 17 Dec 2008
    Last edited: 17 Dec 2008
  6. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Хорошо, чтобы не быть голословными, разберём результаты работы двух вариантов. Итак, для начала выясним, сколько было всего найдено совпадений.
    У твоего варианта - одно, что уже фейл. Вот это совпадение, начинается на начале первого блока и захватывает заодно и второй (было бы их там 200, всё равно совпадение было бы одно):
    PHP:
    [0] => Array
            (
                [
    0] => <div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext1  
            
    </div>  
            <
    div class="c2">  
                
    sometext2  
            
    </div>  
        </
    div>  
    </
    div>  
    <
    div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext3  
            
    </div>  
            <
    div class="c2">  
                
    sometext4  
            
    </div>  
        </
    div>  
    </
    div>
            )
    Теперь совпадения подмасок. Тоже одно:
    PHP:
        [1] => Array
            (
                [
    0] =>   
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext1  
            
    </div>  
            <
    div class="c2">  
                
    sometext2  
            
    </div>  
        </
    div>  
    </
    div>  
    <
    div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext3  
            
    </div>  
            <
    div class="c2">  
                
    sometext4  
            
    </div>  
        </
    div>  

            )
    Собственно, аналогичное для второго варианта:
    Совпадения регулярки:
    PHP:
    [0] => Array
            (
                [
    0] => <div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext1  
            
    </div>  
            <
    div class="c2">  
                
    sometext2  
            
    </div>  
        </
    div>  
    </
    div>
                [
    1] => <div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext3  
            
    </div>  
            <
    div class="c2">  
                
    sometext4  
            
    </div>  
        </
    div>  
    </
    div>
            )
    Совпадания подмасок:
    PHP:
        [1] => Array
            (
                [
    0] =>   
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext1  
            
    </div>  
            <
    div class="c2">  
                
    sometext2  
            
    </div>  
        </
    div>  

                [
    1] =>   
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext3  
            
    </div>  
            <
    div class="c2">  
                
    sometext4  
            
    </div>  
        </
    div>  
     
  7. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Я извиняюсь, а вы последнюю версию моего скрипта запускаете или где? По всей видимости вы юзаете мою ПЕРВУЮ регулярку, заточенную под сайты, а не под бредовые требования Giffts-а. Господа, будьте внимательней, в последнем варианте моего скрипта совсем другая регулярка.

    ЗЫЖ Продам очки, недорого

    Вот моя последняя и вполне рабочая версия, можете найти её несколько выше, еще до Вашего первого поста по этой задаче:

    PHP:
    <?
    $in
    '<div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext1 
            </div> 
            <div class="c2"> 
                sometext2 
            </div> 
        </div> 
    </div> 
    <div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext3 
            </div> 
            <div class="c2"> 
                sometext4 
            </div> 
        </div> 
    </div>'
    ;


    if (
    preg_match_all('/<div class="a1">(.*)<\/div>/s'$in$result)) 
    echo 
    'Оле!'"\r\n"; else echo 'Нету такого';
    $t explode("\r\n"$result[0][0]);
    $count count($t);
    for (
    $i=0;$i<$count;$i++) 
    {
    if (!empty(
    $t[$i])) {echo $t[$i];}
    }
    ?>
     
    #107 Pashkela, 17 Dec 2008
    Last edited: 17 Dec 2008
  8. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Из сообщения 102.
     
  9. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Выводит вот это:
    PHP:
    Оле!
    <
    div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext1  
            
    </div>  
            <
    div class="c2">  
                
    sometext2  
            
    </div>  
        </
    div>  
    </
    div>  
    <
    div class="a1">  
        <
    div class="b1">  
            <
    div class="c1">  
                
    sometext3  
            
    </div>  
            <
    div class="c2">  
                
    sometext4  
            
    </div>  
        </
    div>  
    </
    div>
    Разумеется
    PHP:
    <?php

    $in 
    =
    '<div class="a1">  
        <div class="b1">  
            <div class="c1">  
                sometext1  
            </div>  
            <div class="c2">  
                sometext2  
            </div>  
        </div>  
    </div>  
    <div class="a1">  
        <div class="b1">  
            <div class="c1">  
                sometext3  
            </div>  
            <div class="c2">  
                sometext4  
            </div>  
        </div>  
    </div>'



    preg_match_all('~<div class="\w\d">((?:[^<>]+|(?R))*)</div>~si'$in$data);
    print_r($data[1]);

    ?>
     
  10. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 astrologer:

    Надеюсь теперь увидели, о каком коде идёт речь? "Пост 102" - лихо конечно, но пока не в тему. Жду от вас с нетерпением Вашего кода. Желательно предварительно проверенного и рабочего:) Но готов и просто принять "Паша, ты был прав, о чем тут писать дальше - просто не вижу смысла". А то флудильня получается. А яйцами с вами меряться мне недосуг, ибо голые факты пока за меня, если без эмоций:)
     
  11. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Жаль расстраивать, но факты против тебя. Ты был неправ, о чём тут писать дальше - просто не вижу смысла.
     
  12. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    ыыыыы, интересненько, а у меня выводит вот это:

    а поводу вашего я написал сразу же после вашего кода, Ваш код нерабочий, ппц, имхо

    ЗЫЖ Ребята, к Chaak в ЛС хоть пройдите, а то мне уже неудобно тут с вами. Незлобный я в принципе:)
     
    #112 Pashkela, 17 Dec 2008
    Last edited: 17 Dec 2008
    1 person likes this.
  13. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Надо исходник смотреть, как все делают.
     
  14. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    "Надо исходник смотреть, как все делают."

    ыыыыыы, отсыпьте, чо вы там с Giffts-ом покурили, усыхаю с вас:)))))))))))))))
     
  15. .:EnoT:.

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

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Сегодня день срача?) То в одной теме, то в другой...ппц

    это у тебя на экран выводит, а в исходном коде всё равно дивы)
    Но тут можно избавиться от них ф-цией strip_tags()

    А отпарсить парный див в данном случае думаю невозможно, т.к. либо парсить всё, либо до первого дива с модификатором U.

    Поэтому в данном случае регулярка Pashkela имеет смысл, но немного недоработана.
    Вот немного переделал:
    PHP:
    preg_match_all('#<div[^>]*>([^>]*)</div>#sU'$in$result);
    print_r($result);
    результатом будет:

    Code:
    [1] => Array
            (
                [0] => 
                sometext1
            
                [1] => 
                sometext2
            
                [2] => 
                sometext3
            
                [3] => 
                sometext4
            
            )
    
    )
    Чистый текст, что у нужен был Gifts`у :)
     
    1 person likes this.
  16. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 astrologer мои извинения:) Исходники страницы не посмотрел:)
     
  17. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Я таки домучал эту штуку
    PHP:
    <pre><?php 
    $in
    ='<div class="a1">  
        <div class="b1">  
            <div class="c1">  
                sometext1  
            </div>  
            <div class="c2">  
                sometext2  
            </div>  
        </div>  
    </div>  
    <div class="a1">  
        <div class="b1">  
            <div class="c1">  
                sometext3  
            </div>  
            <div class="c2">  
                <div class="d1">
                    <a href="somelink">asdasasd</a>
                </div>
            </div>  
        </div>  
    </div> '
    ;

    $start=microtime(true);
    if (
    preg_match_all('~<div[^>]*>((?(?=(?>(<div|</div>)))(?R)|[\s\S])*)</div>~si'$in$resultPREG_SET_ORDER))

    foreach (
    $result as $one) echo htmlspecialchars($one[1])."\r\n-----------------------------\r\n";

    echo 
    microtime(true)-$start;
    Находит весь текст между дивами верхнего уровня, для любой глубины вложенности

    .:EnoT:. Боюсь, что банальная ссылка внутри дива заставит регулярку пропустить эту ссылку

    astrologer Спасибо за направление для копания)
     
    _________________________
  18. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    а если так, то моя моя регулярка остается самой логичной, гыыыыыыыыы. Но с поправкой .:EnoT:.-а
     
  19. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Pashkela Как обезьянка, ей-богу
    PHP:
    $in
    '<div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext1 
            </div> 
            <div class="c2"> 
                sometext2 
            </div> 
        </div> 
    </div> 
    <div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext3 
            </div> 
            <div class="c2"> 
                sometext4 
            </div> 
        </div> 
    </div>'
    ;
    echo 
    "<h1>До регулярки:</h1><br>\r\n";
    var_dump(htmlspecialchars($in));
    echo 
    "<h1>После регулярки:</h1><br>\r\n";
    if (
    preg_match_all('/<div class="a1">(.*)<\/div>/s'$in$result)) var_dump(htmlspecialchars($result[0][0]));
    echo 
    "<br><h1>А теперь внимание, найдите десять отличий</h1>";
     
    _________________________
  20. Zircool

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

    Joined:
    1 Mar 2006
    Messages:
    162
    Likes Received:
    37
    Reputations:
    5
    PHP:
    <h2>
                <
    a href="/News/Detail/id/325474/cat/66/" >
                    
    Почему опустели офисы?</a>            </h2>
    Для такого html кода какая будет регулярка что бы ссылку... Тлоько что бы в регулярке были теги <h2> и </h2>...т.к. на странице с которой грабишь много ссылок вида <a href="">.... нужны ссылки которые именно в тегах <h2> и </h2> находяься...
     
Thread Status:
Not open for further replies.