匹配html中的多个属性值以获取ant buildscript

时间:2011-07-24 17:20:55

标签: html regex xslt ant build.xml

我希望匹配属性的多个值以进行替换。例如

<div class="div h1 full-width"></div>

应该生成div,h1和全宽作为单独的匹配。 我想这样做来为类添加前缀。因此,而不是div h1全宽,它应该是pre-div pre-h1 pre-full-width

我有正规的正则表达式

(?<=class=["'])(\b-?[_a-zA-Z]+[_a-zA-Z0-9-]*\b)+

这只匹配第一堂课。这是幕后的原因,因为这是这种模式应该匹配的唯一东西:(我试图让lookbehind更多,然后只是class =“但我最终得到它采取每一个并留下任何东西来取代。 我想创建一个模式,它在class属性的引号之间单独匹配任何值。

我想为处理所有文件的Ant构建脚本执行此操作,并使用set前缀替换class =“value1 value2 value3”。我已经完成了这个,在替换css文件中的类时遇到了一些麻烦,但是你们看起来很麻烦。

这是一个Ant buildcript。 Java regexp package用于处理模式。使用的ant标记是:replaceregexp

上述模式的实现是:

<target name="prefix-class" depends="">
  <replaceregexp flags="g">
    <regexp  pattern="(?&lt;=class=['&quot;])(\b-?[_a-zA-Z]+[_a-zA-Z0-9-]*\b)+"/>
    <substitution expression=".${prefix}\1"/>
    <fileset dir="${dest}"/>
   </replaceregexp>
</target>    

2 个答案:

答案 0 :(得分:0)

我认为你不能在一个简单的正则表达式中找到n(或在你的情况下为3)不同的类条目并将它们替换。如果你需要在ant中执行此操作,我认为你必须编写自己的ant任务。更好的方法是xslt,你熟悉xslt吗?

答案 1 :(得分:0)

放弃Ants ReplaceRegExp并使用XSLT对我的问题进行排序,将xhtml转换为xhtml。

以下代码为元素类属性的所有值添加前缀。必须正确格式化xhtml源文档才能进行解析。

<xsl:stylesheet version="2.0"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xhtml xsl xs">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd" 
    indent="yes" omit-xml-declaration="yes"/>

  <xsl:param name="prefix" select="'oo-'"/>

  <xsl:template match="/">
    <xsl:apply-templates select="./@*|./node()" />
  </xsl:template>

  <!--remove these atts from output, default xhtml values from dtd -->
  <xsl:template match="xhtml:a/@shape"/>
  <xsl:template match="@rowspan"/>
  <xsl:template match="@colspan"/>

  <xsl:template match="@class">
    <xsl:variable name="replace_regex">
      <xsl:value-of select="$prefix"/>
      <xsl:text>$1</xsl:text>
    </xsl:variable>
    <xsl:attribute name="class">
      <xsl:value-of select="fn:replace( . , '(\w+)' , $replace_regex )"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>