[英]Ruby gsub '<' and '>'
说我有这段文字:
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>')
为什么要重新发明轮子? 您不是第一个想要创建自己的标记语言的人,但是那里有一些很棒的语言。 我个人喜欢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 < >
#=> </code></pre>
您可能已经注意到,Stack Overflow使用Markdown进行用户输入,所以我现在实际上是在Markdown中写我的答案;-)
使用gsub且不使用外部库,这将起作用:
str.gsub(/</, "<").gsub(/>/, ">")
或者仅匹配您的{%...%}
标记之外的内容:
str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
n.gsub(/</, "<").gsub(/>/, ">")
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.