Это небольшая граница для регулярного выражения, поскольку оно зависит от контекста, но все же ...
#\[(\](?=")|[^\]])+\]
должен это сделать.
Идея состоит в том, чтобы упомянуть закрывающую квадратную скобку, которая может быть частью анализируемого содержимого, если за ней следуют двойные кавычки, как часть конца атрибута.
Если бы эта же квадратная скобка была где-то внутри атрибута, это было бы намного сложнее ...
Преимущество в выражении lookahead заключается в том, что вы можете указать регулярное выражение с нефиксированной длиной соответствия.
Поэтому, если за закрывающей квадратной скобкой атрибута не следует двойная кавычка, а следует другое известное выражение, вы просто обновляете часть предпросмотра:
#\[(\](?=</a>")|[^\]])+\]
будет соответствовать только второй закрывающей квадратной скобке, поскольку за первой следует </a>"
.
Конечно, любое жадное выражение (.*]
) не будет работать, так как оно не будет соответствовать второй закрывающей квадратной скобке, а last . (Имеется в виду, что если имеется более одного промежуточного звена ]
, он будет проанализирован.)