替换CDATA中的HTML标记

时间:2009-01-18 14:20:40

标签: regex xslt

我想替换CDATA元素中的一些HTML标记,但是我很难在XSLT中获得正确的语法。我收到此错误消息:

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

我猜它不喜欢regEx中的<>。 有谁知道如何在XSLT中写这个?

这是regEx:

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

2 个答案:

答案 0 :(得分:2)

我认为转义的<>括号不是问题的根源。

查看错误消息,错误发生在char 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

通过这种方式,您可以找到导致错误的原因。

修改

通过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. Sebastian。以下是解释:

<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

标准免责声明适用:正则表达式不是处理HTML的最佳工具。使用风险由您自己承担。

答案 1 :(得分:0)

嗯!只有第一次测试通过。 是的,问题似乎从paranthes开始。

明天会更多地了解它。谢谢到目前为止。

Ť