За последние 24 часа нас посетил 16341 программист и 1586 роботов. Сейчас ищут 1544 программиста ...

Регулярное выражение, проблема с "жадностью"

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

  1. Kvadra256

    Kvadra256 Новичок

    С нами с:
    28 ноя 2014
    Сообщения:
    1
    Симпатии:
    0
    Есть текст:
    Код (Text):
    1. <h1>text1</h1>
    2. <h1>text2</h1><div>textdiv1</div>
    3. <h1>text3</h1><div>textdiv2</div>
    Необходимо выделить этементы типа <h1>***</h1><div>***</div>, т.е. результатом должно быть 2 строки:
    Код (Text):
    1. <h1>text2</h1><div>textdiv1</div>
    2. <h1>text3</h1><div>textdiv2</div>
    Моё регулярное выражение:
    Код (Text):
    1. /<h1>.*?<\/h1><div>.*?<\/div>/i
    В результате находит 2 соответствия:
    Код (Text):
    1. <h1>text1</h1><h1>text2</h1><div>textdiv1</div>
    2. <h1>text3</h1><div>textdiv2</div>
    Не могу понять, почему захватывается текст <h1>text1</h1> ?

    Код PHP:
    Код (Text):
    1. $string = '<h1>text1</h1><h1>text2</h1><div>textdiv1</div><h1>text3</h1><div>textdiv2</div>';
    2. $pattern = '/<h1>.*?<\/h1><div>.*?<\/div>/i';
    3. preg_match_all($pattern, $string, $matches);
    4. foreach ($matches[0] as $match) {
    5.    echo htmlentities($match) . '<br>';
    6. }
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да нет, все правильно (с позиции регулярок). тут не в жадности дело. [^<] на такие случаи обычно
     
  3. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    В начало регулярки ^ в конец $ это означает что искать строку(и) которые подходят под регулярное выражение от начала и до конца.

    http://www.softtime.ru/bookphp/gl7_8.php
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    irobot, и чем это поможет? там одна строка текста. неправильная повторяющаяся группа.
     
  5. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Код (PHP):
    1. $str='<h1>text1</h1><h1>text2</h1><div>textdiv1</div><h1>text3</h1><div>textdiv2</div>';
    2. $m=array();
    3. preg_match_all('~<h1>([^<]+)</h1><div>([^<]+)</div>~iu',$str,$m);
    4. print_r($m); 
    Вывод:
    Код (PHP):
    1. (
    2.     [0] => Array
    3.         (
    4.             [0] => <h1>text2</h1><div>textdiv1</div>
    5.             [1] => <h1>text3</h1><div>textdiv2</div>
    6.         )
    7.  
    8.     [1] => Array
    9.         (
    10.             [0] => text2
    11.             [1] => text3
    12.         )
    13.  
    14.     [2] => Array
    15.         (
    16.             [0] => textdiv1
    17.             [1] => textdiv2
    18.         )
    19.  
    20. ) 
    Если потребуется потом какиенибудь типо отступы или спуски, написать типо:
    Код (PHP):
    1. $str='<h1>text1</h1><h1>text2</h1>
    2. <div>textdiv1</div><h1>text3</h1><div>textdiv2</div>';
    3. $m=array();
    4. preg_match_all('~<h1>([^<]+)</h1>[^<]*<div>([^<]+)</div>~iu',$str,$m);
    5. print_r($m); 
    Добавляем между: </h1>[^<]*<div>
    Код (PHP):
    1. Вывод:
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => <h1>text2</h1>
    6. <div>textdiv1</div>
    7.             [1] => <h1>text3</h1><div>textdiv2</div>
    8.         )
    9.  
    10.     [1] => Array
    11.         (
    12.             [0] => text2
    13.             [1] => text3
    14.         )
    15.  
    16.     [2] => Array
    17.         (
    18.             [0] => textdiv1
    19.             [1] => textdiv2
    20.         )
    21.  
    22. )