2012-12-23 115 views
0

說我有這樣的文字:紅寶石GSUB '<' and '>'

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

如何更換<>&lt;&gt;{% highlight ruby %}...{% endhighlight %}

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

你嘗試'str.gsub (//m,'>')'? – orde

+0

呃,對不起。我忘了提及我只替換了{%highlight ruby​​%} ... {%endhighlight%}'內的'<' and '>'。 – dsdeiz

+0

你在說什麼基本上是解析文檔,這與正則表達式很難做到。不要使用自己的自制標記語言,而是使用HTML或Markdown。 –

回答

2

爲什麼另起爐竈?你不是第一個想要創建自己的標記語言的人,但有一些非常棒的。我個人喜歡Markdown,它在Github上有一個叫做RedCarpet的巨大ruby實現。你可以用這個寶石輕鬆解析文本。下面是一些示例代碼:

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> 

你可能已經注意到,該堆棧溢出採用降價的用戶輸入,所以我其實寫我的答案在降價,現在;-)

+0

是的,我結束了使用Redcarpet。謝謝! – dsdeiz

1

使用GSUB和沒有外部庫,這將工作:

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

或僅匹配您的{%...%}標記之外:

str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n| 
    n.gsub(/</, "&lt;").gsub(/>/, "&gt;") 
end 
我也要跟 <pre><code class="language-ruby">...</code></pre>使用這種替代 {% highlight ruby %}...{% endhighlight %}

上述較長的正則表達式僅將lookbehead和lookahead斷言((?<=%}|\A)(?={%|\z))僅用於找到括號外的子字符串。

但是,最好的方法可能仍然是使用HTMLEntities寶石,因爲它會一直更清晰你在做什麼。

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

str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n| 
    HTMLEntities.new.encode(n) 
end 
+0

呃,對不起。我忘了提及我只替換了{%highlight ruby​​%} ... {%endhighlight%}'內的'<' and '>'。 – dsdeiz