替换链接以外的所有文本

时间:2010-02-10 17:53:01

标签: html ruby regex string

我有很多html文档,我需要在所有文档中将文本“foo”替换为“bar”,链接除外

例如

foo<a href="foo.com">foo</a>

应该改为

bar<a href="foo.com">bar</a>

链接(foo.com)中的网址应保持不变。

图像链接和javascripts或样式表链接中的相同情况,只应替换文本,网址应保持不变。

任何关于一个好的正则表达式的想法? :)

我也可以使用Ruby:)

2 个答案:

答案 0 :(得分:1)

我建议使用hpricot,这样您就可以对inner_html元素执行操作。你需要的东西不仅仅是一个正则表达式来获得你想要的东西。

答案 1 :(得分:1)

正则表达式无法解析HTML。使用XSLT等工具来完成工作:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="//text()[name(..) != 'script']">
    <xsl:call-template name="replace-foo" />
  </xsl:template>

  <xsl:template name="replace-foo">
    <xsl:param name="text" select="." />
    <xsl:choose>
      <xsl:when test="contains($text, 'foo')">
        <xsl:value-of select="substring-before($text, 'foo')"/>
        <xsl:text>bar</xsl:text>
        <xsl:call-template name="replace-foo">
          <xsl:with-param name="text" select="substring-after($text, 'foo')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

使用以下输入

<html>
<head><title>Yo!</title></head>
<body>
<!-- foo -->
foo<a href="foo.com">foo</a>
<script>foo</script>
</body>
</html>

你会得到

$ xsltproc replace-foo.xsl input.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Yo!</title>
</head>
<body>
<!-- foo -->
bar<a href="foo.com">bar</a>
<script>foo</script>
</body>
</html>