假设我有这样的文本:
foo
{% highlight ruby %}
bar < >
{% endhighlight %}如何在{% highlight ruby %}...{% endhighlight %}中将<和>替换为<和>?我还用<pre><code class="language-ruby">...</code></pre>替换了{% highlight ruby %}...{% endhighlight %},如下所示:
str.gsub(/\{% highlight (\w*) %\}(.*)\{% endhighlight %\}/m, '<pre><code class="language-\1">\2</code></pre>')发布于 2012-12-24 06:37:20
为什么要重新发明轮子呢?你不是第一个想要创建自己的标记语言的人,但是有一些非常棒的。我个人喜欢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 < >
#=> </code></pre>您可能已经注意到,Stack Overflow使用Markdown作为用户输入,因此我现在实际上正在用Markdown编写我的答案;-)
发布于 2012-12-24 05:22:23
使用gsub而不使用外部库,这将起作用:
str.gsub(/</, "<").gsub(/>/, ">")或者仅匹配{%...%}标记之外的内容:
str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
n.gsub(/</, "<").gsub(/>/, ">")
end上面较长的正则表达式使用后视和前视断言((?<=%}|\A)和(?={%|\z))来仅查找括号外的子字符串。
但是,最好的方法可能仍然是使用HTMLEntities gem,因为它总是更清楚您在做什么。
require 'htmlentities'
HTMLEntities.new.encode(str)或
str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
HTMLEntities.new.encode(n)
endhttps://stackoverflow.com/questions/14013971
复制相似问题