#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
ищется после этого тега привязки.
$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);