Помогите с регуляркой

Тема в разделе "Регулярные выражения", создана пользователем javx, 18 дек 2015.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    246
    PHP:
    <div class="ok"><span>один текст</span><span>текст которого может и не быть</span></div>
    подскажите как php регуляркой извлечь текст из span, находящийся в диве "ok" но при этом если <span> несколько извлечь каждый, а если один то один.

    кто пользуется regex101.com, почему не подсвечивается поле с регуляркой? Перейти по ссылке вчера подсвечивалось всё как надо. :conf:
     
    Последнее редактирование модератором: 18 дек 2015
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    205
    Симпатии:
    259
    Перейти по ссылке
    PHP:
    $str '<div class="ok"><span>один текст</span><span>текст которого может и не быть</span></div>';
    preg_match('~<div class="ok">(.*?)</div>~s'$str$match);
    echo 
    strip_tags($match[1]);
     
    javx нравится это.
  3. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    246
    :D мне не всё подряд нужно, я хочу извлечь то что внутри span - при этом сделать всё одной регуляркой. Я могу это реализовать через две регулярки, сперва содержимое div получить а далее отдельно содержимое span. Но хочу научится как делать это одной регуляркой.
     
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    205
    Симпатии:
    259
    А тегов <span> подряд только два или больше?
    Пример для захвата одного и более подряд тегов <span>
    Код:
    preg_match('~<div class="ok">((?:\s*<span>[^<]+</span>)+)~', $str, $match);
    echo strip_tags($match[1]);
    
     
    javx нравится это.
  5. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    246
    тег span один или до 5. в одном теге например one, в соседнем two. Смогу ли я получить в результате $match == array('one','two');
     
  6. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    205
    Симпатии:
    259
    Ну если нужен именно массив, тогда в качестве квантификатора используй знак вопроса и строй такую цепочку
    Код:
    <div class="ok"><span>([^<]+)</span>(?:<span>([^<]+)</span>)?(?:<span>([^<]+)</span>)?
    
    Перейти по ссылке
     
    Последнее редактирование: 18 дек 2015
    javx нравится это.
  7. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    246
    Да это то что нужно, но нельзя ли это реализовать не повторяя код, например будет 50 элементов спан, и все их нужно преобразовать в элементы массива. Не писать же все 50 вариантов (?:<span>([^<]+)</span>)? таким образом? типа как ведёт себя + или {0,} для символов. Только как реализовать это для групп с нашим условием... ПС: скажи у тебя подсвечивается строка с регулярным выражением в regex101.com ?
     
  8. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    205
    Симпатии:
    259
    Ну писать все 50 вариантов не обязательно. Если подумать, то на ум приходит забавный такой трюк с метасимволом \G и preg_match_all
    PHP:
    preg_match_all('~<div class="ok">|\G(?!\A)<span>([^<]+)</span>~'$str$match);
    print_r($match[1]);
    Метасимвол \G совпадает с позицией, в которой завершилось предыдущее совпадение. Это позволяет собрать все теги span идущие сразу за <div class="ok">.
    Там в результатах будет пустой первый элемент это после нахождения <div class="ok">. Легко удаляется array_shift().

    PS: Подсветка на regex101.com работает норм. Там по умолчанию в качестве разделителя косая черта и её тогда нужно экранировать в регулярке <\/span>. Жмакни по разделителю что перед строкой и выбери из списка другой.
     
    Последнее редактирование: 18 дек 2015
    javx нравится это.
  9. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    528
    Симпатии:
    246
    Разобрался, там в настройках(иконка ключа гаечного) почему то чекбокс убрался с подсветки, а я голову ломал. За \G не знал раньше, сейчас почитаю инфу.
    + узнал только что, что бы regex101 работал в режиме preg_match_all нужно модификатор "g" указать :D а я этого не знал, и поэтому ерунду получал (первое входжение)
     
    Последнее редактирование: 19 дек 2015
Статус темы:
Закрыта.