2016-10-07 2 views
0

Я пытаюсь использовать регулярное выражение в PHP, чтобы найти все слова COUNT исключая те, которые расположены в якорный текстисключить результаты поиска внутри якорного текста

я начинаю с/\ Ь (количество) \ б/я, но может не получить именно то, что мне нужно

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` 
+0

Попробуйте [ 'preg_match_all ('~ [^ <]* (* SKIP) (?!) | \ bcount \ б ~ я', $ S);'] (HTTPS: //ideone.com/B23wBE) –

ответ

2

Вы можете использовать negative lookahead:

/count(?!<\/a>)(?!&)/i 

Матчи: Цикл Количество Хранятся как <a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count</a>, который является графа записей цикла Количества

EXAMPLE

Для вашего второго запроса вы бы просто использовать отрицательный взгляд вперед, чтобы игнорировать слово заканчивающегося на пространство и 'время':

count(?!&)(?!\stime) 

EXAMPLE

Матчи: Цикл счета Хранится как <a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count time</a>, который является граф записей цикла Количество

Теперь слово предупреждения: это довольно хрупким, если вы не знаю, какое слово будет следовать за «подсчет» при использовании между скобками.

+0

Это работает, однако, еще одна морщина в этой строке терпит неудачу. Цикл отсчета хранится как Cycle count time, который является подсчетом записей. Цикл count' – Mikemcs

+0

Вы хотите поэкспериментировать с этим? Или мне нужно было изменить свой ответ? –

+0

Я экспериментирую, но не повезло, если бы вы могли изменить ответ, который был бы замечательным. Спасибо. – Mikemcs

0

Учтите, что если у вас есть правильный, действительный код 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);