С помощью регулярного выражения выбрать всё, кроме определенных слов

Имеется html-документ, который содержит якоря:

$html = <<<aaa
<a name="aaaa"></a>
...
<a name="bbbb"></a>
...
<a name="cccc"></a>
...
<a name="dddd"></a>
...
<a name="eeee"></a>
aaa;

Необходимо с помощью регулярного выражения выбрать все якоря, кроме тех, чьи имена равны "bbbb" и "cccc".

Как для этой задачи прописать шаблон ($pattern) для функции

preg_match_all($pattern, $html, $matches)

Что-то вроде:

$pattern = "/<a name=\"^(bbbb|ccc)\"><\/a>/";

Ожидаю получить массив следующих строк:

'<a name="aaaa"></a>'
'<a name="dddd"></a>'
'<a name="eeee"></a>'

Ответы (2 шт):

Автор решения: ksa

Необходимо с помощью регулярного выражения выбрать все якоря, кроме тех, чьи имена равны "bbbb" и "cccc".

Предложу такой вариант...

const v = `<a name="aaaa"></a>
...
<a name="bbbb"></a>
...
<a name="cccc"></a>
...
<a name="dddd"></a>
...
<a name="eeee"></a>`
const r = /<a\sname="(?!bbbb|ccc).+?<\/a>/g
console.log(v.match(r))

→ Ссылка
Автор решения: abu
<?php
$html = <<<aaa
<a name="aaaa"></a>
...
<a name="bbbb"></a>
...
<a name="cccc"></a>
...
<a name="dddd"></a>
...
<a name="eeee"></a>
aaa;

$excludes = [
    'bbbb',
    'cccc'
];
$template = sprintf('/<a name="(?!%s).*?>.*?<\/a>/', implode('|', $excludes));

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

var_dump($template, $matches);
→ Ссылка