Заменить HTML-теги в CDATA - PullRequest
1 голос
/ 18 января 2009

Я хочу заменить некоторые HTML-теги, которые есть в элементе CDATA, но я борюсь с правильным синтаксисом в XSLT. Я получаю это сообщение об ошибке:

net.sf.saxon.trans.XPathException: Error at character 9 in regular 
expression "<img(\s+(?![^<>]*alt=["\'])[^<...": expected ()) (line 51)

Полагаю, ему не нравится <> внутри regEx. Кто-нибудь знает, как написать это в XSLT?

Вот регекс:

<xsl:variable name="imgTagWithoutAltAttributePattern">
<xsl:text disable-output-escaping="yes">&lt;img(\s+(?![^&lt;&gt;]*alt=["\'])[^&lt;&gt;]+)/&gt;</xsl:text></xsl:variable>

Ответы [ 2 ]

2 голосов
/ 18 января 2009

Не думаю, что экранированные <> скобки являются источником проблемы.

Глядя на сообщение об ошибке, ошибка указана в 9-й строке, где ожидаются закрывающие скобки ")":

<img(\s+(?![^<>]*alt=["\'])[^<...
--------^

Как видите, "&lt;&gt;" получается просто отлично. Я подозреваю, что движок регулярных выражений не понимает регулярные выражения каким-либо другим образом (может быть, проблема в отрицательном прогнозе?).

Я предлагаю сначала попробовать более простое регулярное выражение, разбив оригинальное в различных тестах, чтобы выделить проблему:

<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
&lt;img\s(a[^l]|al[^t]|alt\s*[^=]|[^a&gt;])*&gt;  // 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. Используйте на свой страх и риск.

0 голосов
/ 18 января 2009

гм! Только первый тест прошел. Да, проблема, кажется, начинается с парантов.

Завтра рассмотрим это подробнее. Пока спасибо.

T * 1005

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...