исключить результаты, найденные внутри текста привязки

#php #regex #preg-match

#php #регулярное выражение #preg-match

Вопрос:

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

Я начинаю с /b(count)b /i, но не могу получить именно то, что мне нужно

 Cycle count Stored as a <a href="poem://plaspoem/POEM?LOC=MAINamp;CMD=VIEWamp;KEY=CYCLE COUNTamp;REV=A">Cycle count</a> which is a count of records Cycle count`
  

Комментарии:

1. Попробуйте preg_match_all('~<ab[^<]*?>[^<]*</a>(*SKIP)(?!)|bcountb~i', $s);

Ответ №1:

Вы можете использовать отрицательный прогноз:

 /count(?!</a>)(?!amp;)/i
  

Совпадения: количество циклов, сохраненное как <a href="poem://plaspoem/POEM?LOC=MAINamp;CMD=VIEWamp;KEY=CYCLE COUNTamp;REV=A">Cycle count</a> , которое является количеством записей, количество циклов

ПРИМЕР

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

 count(?!amp;)(?!stime)
  

ПРИМЕР

Совпадения: количество циклов, сохраненное как <a href="poem://plaspoem/POEM?LOC=MAINamp;CMD=VIEWamp;KEY=CYCLE COUNTamp;REV=A">Cycle count time</a> , которое является количеством записей, количество циклов

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

Комментарии:

1. Это работает, однако еще 1 ошибка в этой строке Cycle count Stored as a <a href="poem://plaspoem/POEM?LOC=MAINamp;CMD=VIEWamp;KEY=CYCLE COUNTamp;REV=A">Cycle count time</a> which is a count of records Cycle count

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

3. Я экспериментирую, но безуспешно, если бы вы могли изменить ответ, это было бы здорово. Спасибо.

4. Я думаю, это моя проблема, поскольку я не знаю, какие или сколько слов могут следовать за «count» (если есть) внутри ссылки. основы того, что мне нужно, — сопоставить все экземпляры ‘count’, не находящиеся внутри текста привязки или привязки html, независимо от того, сколько слов до или после него в привязке

Ответ №2:

ОБРАТИТЕ внимание, что если у вас есть правильный, корректный HTML-код, вы всегда можете полагаться на PHP DOMDocument и XPath. Поскольку строка не является допустимым HTML, вы можете вернуться к регулярному выражению.

Я не знаю, что или сколько слов может следовать за «count» (если есть) внутри ссылки

Если вы используете count(?!</a>)(?!amp;) шаблон, он будет пропускать только count подстроку, за которой сразу следует </a> или amp; (обратите внимание, что выражение такое же, как count(?!(?:</a>|amp;)) ).

Чтобы разрешить любые символы 0 после слова count и избежать переполнения </a> тега, вам необходимо использовать [^<]* конструкцию, соответствующую 0 или более символам, отличным от < предпросмотра.

 '~bcountb(?![^<]*</a>)~'
  

Смотрите демонстрацию регулярных выражений

Регулярное выражение будет соответствовать всем целым словам count , за которыми не следуют символы 0 , отличные от < and then </a> .

Более уместен другой подход: мы сопоставляем все a теги и пропускаем их, и сопоставляем только целые слова count внутри другого текста:

 '~<ab[^<]*?>[^<]*</a>(*SKIP)(?!)|bcountb~'
  

Смотрите другую демонстрацию

Здесь <ab[^<]*?>[^<]*</a>(*SKIP)(?!) часть соответствует <a 0 символам, отличным от < как можно меньшего количества раз, до первого > , затем [^<]* сопоставляет текст привязки и </a> сопоставляет тег закрытия, и этот сопоставленный текст отбрасывается, а следующее совпадение для целого слова count ищется после этого тега привязки.

Демонстрация PHP:

 $s = 'Cycle count Stored as a <a href="poem://plaspoem/POEM?LOC=MAINamp;CMD=VIEWamp;KEY=CYCLE COUNTamp;REV=A">Cycle count</a> which is a count of records Cycle count';
echo "Approach 1: " . preg_match_all('~<ab[^<]*?>[^<]*</a>(*SKIP)(?!)|bcountb~', $s) . "nnApproach 2: ";
echo preg_match_all('~bcountb(?![^<]*</a>)~', $s);