首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby gsub '<‘and '>’

Ruby gsub '<‘and '>’
EN

Stack Overflow用户
提问于 2012-12-24 03:20:32
回答 2查看 595关注 0票数 0

假设我有这样的文本:

代码语言:javascript
复制
foo
{% highlight ruby %}
bar < >
{% endhighlight %}

如何在{% highlight ruby %}...{% endhighlight %}中将<>替换为&lt;&gt;?我还用<pre><code class="language-ruby">...</code></pre>替换了{% highlight ruby %}...{% endhighlight %},如下所示:

代码语言:javascript
复制
str.gsub(/\{% highlight (\w*) %\}(.*)\{% endhighlight %\}/m, '<pre><code class="language-\1">\2</code></pre>')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-24 06:37:20

为什么要重新发明轮子呢?你不是第一个想要创建自己的标记语言的人,但是有一些非常棒的。我个人喜欢Markdown,它有一个很棒的ruby实现,叫做RedCarpet,来自Github的人。你可以很容易地用这个gem解析文本。下面是一些示例代码:

代码语言:javascript
复制
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编写我的答案;-)

票数 3
EN

Stack Overflow用户

发布于 2012-12-24 05:22:23

使用gsub而不使用外部库,这将起作用:

代码语言:javascript
复制
str.gsub(/</, "&lt;").gsub(/>/, "&gt;")

或者仅匹配{%...%}标记之外的内容:

代码语言:javascript
复制
str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
  n.gsub(/</, "&lt;").gsub(/>/, "&gt;")
end

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

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

代码语言:javascript
复制
require 'htmlentities'
HTMLEntities.new.encode(str)

代码语言:javascript
复制
str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
  HTMLEntities.new.encode(n)
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14013971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档