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

Статус
В этой теме нельзя размещать новые ответы.

javx

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

кто пользуется regex101.com, почему не подсвечивается поле с регуляркой? Для просмотра ссылки Войди или Зарегистрируйся вчера подсвечивалось всё как надо. :conf:
 
Последнее редактирование модератором:
Для просмотра ссылки Войди или Зарегистрируйся
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
Для просмотра ссылки Войди или Зарегистрируйся
PHP:
preg_match('~<div class="ok">(.*?)</div>~s', $str, $match);
echo strip_tags($match[1]);
:D мне не всё подряд нужно, я хочу извлечь то что внутри span - при этом сделать всё одной регуляркой. Я могу это реализовать через две регулярки, сперва содержимое div получить а далее отдельно содержимое span. Но хочу научится как делать это одной регуляркой.
 
А тегов <span> подряд только два или больше?
Пример для захвата одного и более подряд тегов <span>
Код:
preg_match('~<div class="ok">((?:\s*<span>[^<]+</span>)+)~', $str, $match);
echo strip_tags($match[1]);
 
  • Нравится
Реакции: javx
А тегов <span> подряд только два или больше?
Пример для захвата одного и более подряд тегов <span>
Код:
preg_match('~<div class="ok">((?:\s*<span>[^<]+</span>)+)~', $str, $match);
echo strip_tags($match[1]);
тег span один или до 5. в одном теге например one, в соседнем two. Смогу ли я получить в результате $match == array('one','two');
 
Ну если нужен именно массив, тогда в качестве квантификатора используй знак вопроса и строй такую цепочку
Код:
<div class="ok"><span>([^<]+)</span>(?:<span>([^<]+)</span>)?(?:<span>([^<]+)</span>)?
Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
  • Нравится
Реакции: javx
Да это то что нужно, но нельзя ли это реализовать не повторяя код, например будет 50 элементов спан, и все их нужно преобразовать в элементы массива. Не писать же все 50 вариантов (?:<span>([^<]+)</span>)? таким образом? типа как ведёт себя + или {0,} для символов. Только как реализовать это для групп с нашим условием... ПС: скажи у тебя подсвечивается строка с регулярным выражением в regex101.com ?
 
Ну писать все 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>. Жмакни по разделителю что перед строкой и выбери из списка другой.
 
Последнее редактирование:
  • Нравится
Реакции: javx
Ну писать все 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>. Жмакни по разделителю что перед строкой и выбери из списка другой.
Разобрался, там в настройках(иконка ключа гаечного) почему то чекбокс убрался с подсветки, а я голову ломал. За \G не знал раньше, сейчас почитаю инфу.
+ узнал только что, что бы regex101 работал в режиме preg_match_all нужно модификатор "g" указать :D а я этого не знал, и поэтому ерунду получал (первое входжение)
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху