Регулярное выражение для поиска html-тегов

Я пытаюсь написать функцию, которая найдет каждую подстроку в строке, где подстрока - это какой-то тег html, например

<li>

Но мое регулярное выражение не работает, и я не могу найти свою ошибку.

    $str = 'hello brbrbr <li> hello</li> <li>how are you?</li>';
    $items = preg_match_all('/(<li>\w+<\/li>)', $str, $matches);

$items должен быть массивом желаемых подстрок


person Venka    schedule 26.08.2020    source источник
comment
\w — это любой символ слова, у вас есть место, возможно, будет достаточно добавить \s.   -  person Bizley    schedule 26.08.2020
comment
Ах да, выражение тоже не закрывается корректно. Перейдите на сайт regex101.com и поэкспериментируйте с ним.   -  person Bizley    schedule 26.08.2020
comment
без пробела у меня также есть 0 подстрок в $items   -  person Venka    schedule 26.08.2020
comment
Спасибо, теперь у меня есть правильное выражение (‹li›\w+‹\/li›), но у меня все еще есть только счетчик подстроки, и эта функция нашла только первую   -  person Venka    schedule 26.08.2020
comment
Рассмотрите возможность использования DOMDocument для анализа тегов HTML или XML и управления ими. Не изобретайте велосипед с Regex.   -  person Markus Zeller    schedule 26.08.2020


Ответы (2)


Рассмотрите возможность использования DOMDocument для анализа тегов HTML или XML и управления ими. Не изобретайте велосипед с Regex.

$str = 'hello brbrbr <li> hello</li> <li>how are you?</li>';
$dom = new DOMDocument();
$dom->loadHTML($str);
$li = $dom->getElementsByTagName('li');
$value = $li->item(0)->nodeValue;
echo $value;

' Привет'


Или, если вы хотите перебрать все

foreach($li as $item)
    echo $item->nodeValue, PHP_EOL;

'привет'
'как дела?'

person Markus Zeller    schedule 26.08.2020

Ответ Маркуса правильный, но если вам просто нужно быстрое и грязное регулярное выражение, вот оно:

$str = 'hello brbrbr <li> hello</li> <li>how are you?</li>';
preg_match_all('/(<li>.+<\/li>)/U', $str, $items);

U делает его нежадным.

person Bizley    schedule 26.08.2020