Не думаю, что экранированные <>
скобки являются источником проблемы.
Глядя на сообщение об ошибке, ошибка указана в 9-й строке, где ожидаются закрывающие скобки ")"
:
<img(\s+(?![^<>]*alt=["\'])[^<...
--------^
Как видите, "<>"
получается просто отлично. Я подозреваю, что движок регулярных выражений не понимает регулярные выражения каким-либо другим образом (может быть, проблема в отрицательном прогнозе?).
Я предлагаю сначала попробовать более простое регулярное выражение, разбив оригинальное в различных тестах, чтобы выделить проблему:
<img\s[^>]+/> // test without look-ahead
<img(?=\s)[^>]+/> // test with positive look-ahead
<img(?!\S)[^>]+/> // test with negative look-ahead
<img((?!\S))[^>]+/> // negative look-ahead in parentheses
<img\s(?![^>]+alt=["'])[^>]+/> // your intention, expressed differently
Таким образом, вы сможете найти причину ошибки.
EDIT
По собственному утверждению OP, использование упреждающего просмотра в регулярном выражении вызывает ошибку, поэтому, очевидно, упреждающий просмотр не поддерживается этим механизмом регулярных выражений.
Чтобы соответствовать только <img>
тегам, которые не содержат alt
атрибутов, просмотр не абсолютно требуется. Я предлагаю другой подход:
<img\s(a[^l]|al[^t]|alt\s*[^=]|[^a>])*> // literal form
<img\s(a[^l]|al[^t]|alt\s*[^=]|[^a>])*> // XML-encoded form
Благодарность за этого маленького зверя: J.F. Себастьян . Вот объяснение:
<img\s ....... start of img tag
( ....... start of alternatives: either
a[^l] ....... "a", not followed by "l"
| ....... or
al[^t] ....... "al", not followed by "t"
| ....... or
alt\s*[^=] ....... "alt", not followed by an equals sign
| ....... or
[^a>] ....... neither "a" nor ">"
)* ....... end of alternatives, repeat as often as possible
> ....... end of image tag
Применяется стандартный отказ от ответственности: Regex - не лучший инструмент для обработки HTML. Используйте на свой страх и риск.