2010-02-10 9 views
2

У меня есть много HTML документов, мне нужно заменить текст «Foo» в «бар» во всех документах, за исключением ссылокЗаменить весь текст, кроме ссылок

Например

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

следует raplaced до

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

URL-адрес ссылки (foo.com) должен быть оставлен нетронутым.

В том же случае в ссылках на изображения и ссылках на javascripts или stylesheets, только текст должен быть заменен, URL-адреса должны быть неизменными.

Любые идеи для хорошего регулярного выражения или что-то в этом роде? :)

я могу использовать Руби тоже :)

ответ

1

Я бы рекомендовал использовать hpricot, который позволит вам выполнять действия на inner_html всего элементов. Вам понадобится нечто большее, чем регулярное выражение, чтобы получить то, что вы хотите.

+0

Хорошая идея, это работает! благодаря :) – astropanic

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> 
Смежные вопросы