0

私がこのテキストを持っているとしましょう:

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

どうすれば交換<でき>ますか?私もこれを使用して置き換えています:&lt;&gt;{% highlight ruby %}...{% endhighlight %}{% highlight ruby %}...{% endhighlight %}<pre><code class="language-ruby">...</code></pre>

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

2 に答える 2

3

なぜ車輪の再発明をするのですか?あなたは独自のマークアップ言語を作成したい最初の人ではありませんが、そこにはかなり素晴らしいものがいくつかあります。私は個人的に、Githubの人々からRedCarpetと呼ばれる素晴らしいルビーの実装があるMarkdownが好きです。この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で答えを書いています;-)

于 2012-12-23T22:37:19.810 に答える
1

gsubを使用し、外部ライブラリを使用しない場合、これは機能します。

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

または、マークアップの外側でのみ一致させるには{%...%}

str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
  n.gsub(/</, "&lt;").gsub(/>/, "&gt;")
end

上記の長い正規表現では、ルックビハインドアサーションとルックアヘッドアサーション((?<=%}|\A)および(?={%|\z))を使用して、角かっこの外側にあるサブストリングのみを検索します。

ただし、HTMLEntitiesジェムを使用するのが最善の方法です。これは、実行していることが常に明確になるためです。

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

また

str.gsub(/(?<=%}|\A)(.+?)(?={%|\z)/) do |n|
  HTMLEntities.new.encode(n)
end
于 2012-12-23T21:22:22.953 に答える