Если вы хотите, чтобы ваш lookahead действовал против каждого символа до конца открывающего тега, вам нужно разделить класс символов и квантификатор следующим образом:
<cfquery\b(?:(?!name=)[^>])*>
Обратите внимание на \b
(границу слова) вместо пробела - это позволит <cfquery>
совпадать (при этом все еще блокируя теги <cfqueryparam...>
. (\b
после буквенно-цифрового символа гарантирует, что следующий символ не алфавитно-цифровой). )
Также стоит отметить, что (?:
... )
- это группа без захвата - похожа на обычную (
... )
, но не создает обратную ссылку, так как нам не нужно это.
Конечно, есть небольшая вероятность того, что это не будет соответствовать правильно - если у вас есть атрибут notname
или у вас есть name = "whatever"
, они оба будут обработаны неправильно.
Чтобы решить эту проблему, мы можем снова использовать \b
перед именем на этот раз, а затем использовать необязательный \s
, чтобы разрешить (но не требовать) любые пробелы между именем атрибута и знаком равенства:
<cfquery\b(?:(?!\bname\s*+=)[^>])*>
И не забудьте убедиться, что флаг без учета регистра включен, если у вас могут быть теги / атрибуты в любом месте в смешанном / верхнем регистре.