繁体   English   中英

Ruby gsub'<'和'>'

[英]Ruby gsub '<' and '>'

说我有这段文字:

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

如何用&lt;替换<> &lt; &gt; {% 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>')

为什么要重新发明轮子? 您不是第一个想要创建自己的标记语言的人,但是那里有一些很棒的语言。 我个人喜欢Markdown ,它在Github上有一个很棒的红宝石实现,叫做RedCarpet 您可以使用此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中写我的答案;-)

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM