0

说我有这个文本:

foo
{% highlight ruby %}
bar < >
{% endhighlight %}

如何替换<and >with &lt;and &gt;inside {% highlight ruby %}...{% endhighlight %}?我也{% highlight ruby %}...{% endhighlight %}<pre><code class="language-ruby">...</code></pre>这个代替:

str.gsub(/\{% highlight (\w*) %\}(.*)\{% endhighlight %\}/m, '<pre><code class="language-\1">\2</code></pre>')
4

2 回答 2

3

为什么要重新发明轮子?您不是第一个想要创建自己的标记语言的人,但是那里有一些非常棒的语言。我个人喜欢Markdown,它有一个很棒的 ruby​​ 实现,叫做RedCarpet,来自 Github 的人们。您可以使用此 gem 轻松解析文本。这是一些示例代码:

require 'redcarpet'

input = <<-EOF
foo

    bar < >
EOF

Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(input)
#=> <p>foo</p>
#=>
#=> <pre><code>bar &lt; &gt;
#=> </code></pre>

您可能已经注意到,Stack Overflow 使用 Markdown 进行用户输入,所以我现在实际上正在用 Markdown 写我的答案 ;-)

于 2012-12-23T22:37:19.810 回答
1

使用 gsub 并且没有外部库,这将起作用:

str.gsub(/</, "&lt;").gsub(/>/, "&gt;")

或仅匹配您的{%...%}标记之外:

str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
  n.gsub(/</, "&lt;").gsub(/>/, "&gt;")
end

上面较长的正则表达式使用lookbehind 和lookahead 断言((?<=%}|\A)(?={%|\z))只查找括号外的子字符串。

但是,最好的方法可能仍然是使用 HTMLEntities gem,因为它总是会更清楚你在做什么。

require 'htmlentities'
HTMLEntities.new.encode(str)

或者

str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
  HTMLEntities.new.encode(n)
end
于 2012-12-23T21:22:22.953 回答