Исключение слова в preg_match_all

Рейтинг: 0Ответов: 2Опубликовано: 06.08.2023

Есть задача найти все вхождения текстов в исключая одно слово. Нахожу таким способом:

preg_match_all(/<div>(.*?)<\/div>/is, $html, $matches);

Находит:

<div>текст1</div> -> текст1
<div>текст2</div> -> текст2
<div>текст3</div> -> текст3

А вот можно, как то исключить слово "текст2" прямо в регулярном выражении, не прибегая к перебору массива?

Ответы

▲ 0
$except = "текст2";
$regex = "/<div>(?!$except)(.*?)<\/div>/is";
$html = "
<div>текст1</div> -> текст1
<div>текст2</div> -> текст2
<div>текст3</div> -> текст3
";
$matches = [];

preg_match_all($regex, $html, $matches);

var_dump($matches);

Выведет

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(22) "<div>текст1</div>"
    [1]=>
    string(22) "<div>текст3</div>"
  }
  [1]=>
  array(2) {
    [0]=>
    string(11) "текст1"
    [1]=>
    string(11) "текст3"
  }
}
▲ 0

Потестировал. В предложенном варианте слово должно быть в начале текста. Вот нашел вариант, где оно может быть в любом месте в контенте DIV:

'/<div>((?:(?!текст1).)*?)<\/div>/is'

Но вопрос с обратным эффектом остался. Как ОСТАВИТЬ только DIV c "текст1", а остальные (неизвестное кол-во) отфильтровать?