Заменить весь текст, кроме ссылок - PullRequest
2 голосов
/ 10 февраля 2010

У меня много HTML-документов, мне нужно заменить текст «foo» на «bar» во всех документах, кроме ссылок

Например

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

должен быть восстановлен до

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

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

То же самое в ссылках на изображения и ссылках на javascripts или таблицы стилей, только текст должен быть заменен, URL должны быть неизменными.

Есть идеи для хорошего регулярного выражения или что-то? :)

Я тоже могу использовать Ruby:)

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Регулярные выражения не могут анализировать 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>
1 голос
/ 10 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...