我有很多html文档,我需要在所有文档中将文本“foo”替换为“bar”,链接除外
例如
foo<a href="foo.com">foo</a>
应该改为
bar<a href="foo.com">bar</a>
链接(foo.com)中的网址应保持不变。
图像链接和javascripts或样式表链接中的相同情况,只应替换文本,网址应保持不变。
任何关于一个好的正则表达式的想法? :)
我也可以使用Ruby:)
答案 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>