2010-02-10 4 views
2

J'ai beaucoup de documents html, je dois remplacer le texte « foo » à « bar » dans tous les documents, à l'exception des liensRemplacer tout le texte à l'exception des liens

Par exemple

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

devrait être raplaced à

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

l'URL dans le lien (foo.com) doit être laissée intacte.

Le même cas dans les liens d'image et les liens vers javascripts ou les feuilles de style, seul le texte doit être remplacé, les URLs doivent rester inchangés.

Des idées pour une bonne regex ou quelque chose? :)

je peux utiliser Ruby aussi :)

Répondre

1

Je vous recommande d'utiliser hpricot, qui vous permettra d'effectuer des actions sur le inner_html des éléments seulement. Vous aurez besoin de quelque chose de plus qu'une regex pour obtenir ce que vous voulez.

+0

Bonne idée, ça marche! Merci :) – astropanic

1

Les expressions régulières ne peuvent pas analyser le code HTML. Utilisez un outil tel que XSLT qui est à la hauteur:

<?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> 

Avec l'entrée suivante

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

vous obtiendrez

$ 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> 
Questions connexes