Учтите, что если у вас есть правильный, действительный код HTML, вы всегда можете полагаться на PHP DOMDocument и XPath. Поскольку строка не является допустимым HTML, вы можете вернуться к регулярному выражению.
Я не знаю, что и сколько слов может следовать «количество» (если таковые имеются) внутри ссылки
Если вы используете count(?!<\/a>)(?!&)
шаблон, то это будет только провалить count
подстроку, которая немедленно следует за </a>
или &
(обратите внимание, что выражение такое же, как и count(?!(?:<\/a>|&))
).
Чтобы разрешить любые 0+ символы после слова count
И, чтобы избежать переполнения через </a>
тег, вам нужно использовать [^<]*
конструкцию, соответствующую другой, чем <
внутри опережающего просмотра 0+ или более символов.
'~\bcount\b(?![^<]*</a>)~'
См regex demo
Регулярное выражение будет соответствовать всем целым словам count
, которые не следует с 0+, кроме <
символов, а затем </a>
.
Другой подход является более целесообразным: мы сопоставляем все a
тегов и пропустить их, и соответствуют только целым словам count
внутри другому текст:
'~<a\b[^<]*?>[^<]*</a>(*SKIP)(?!)|\bcount\b~'
См another demo
Здесь <a\b[^<]*?>[^<]*</a>(*SKIP)(?!)
части соответствует <a
+- + символов, отличных от <
, в несколько раз больше до первого >
, затем [^<]*
соответствует тексту якоря, а </a>
соответствует тегу close, и этот согласованный текст - pped, а следующее совпадение для целого слова count
выполняется после этого тега привязки.
PHP demo:
$s = 'Cycle count Stored as a <a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count</a> which is a count of records Cycle count';
echo "Approach 1: " . preg_match_all('~<a\b[^<]*?>[^<]*</a>(*SKIP)(?!)|\bcount\b~', $s) . "\n\nApproach 2: ";
echo preg_match_all('~\bcount\b(?![^<]*</a>)~', $s);
Попробуйте [ 'preg_match_all ('~ [^ <]* (* SKIP) (?!) | \ bcount \ б ~ я', $ S);'] (HTTPS: //ideone.com/B23wBE) –