1

次の の使用法では、引用符の間に配置されることgsubを期待しています。"No, but I heard it's short and soft."初回は空いています。すぐにもう一度実行すると、正しく動作します。

clean_content = "[quote="PDrizzle":1g581fap]No, but I heard it's short and soft.[/quote:1g581fap]\r\n\r\nwith very few ascents\r\n\r\nheh"
clean_content.gsub(
  /\[quote(?:.*)\](.*?)\[\/quote(?:.*)\]/,
  "<blockquote>#{$1}</blockquote>"
)
# => "<blockquote></blockquote>\r\n\r\nwith very few ascents\r\n\r\nheh" 
clean_content.gsub(
  /\[quote(?:.*)\](.*?)\[\/quote(?:.*)\]/,
  "<blockquote>#{$1}</blockquote>"
)
# => "<blockquote>No, but I heard it's short and soft.</blockquote>\r\n\r\nwith very few ascents\r\n\r\nheh"

何が起こっているのですか?

4

2 に答える 2

4

gsub\\1は、置換文字列内の後方参照がではなくとしてフォーマットされることを期待しています$1。あなたの例では、最初の文字列置換は空の文字列である変数を参照し、2 回目は最初のパターン マッチを実行することによって設定されています。

あなたが望んでいるのは:

clean_content.gsub(/\[quote(?:.*)\](.*?)\[\/quote(?:.*)\]/, "<blockquote>\\1</blockquote>")
于 2012-09-26T02:36:41.587 に答える
0

引数の評価は、それらを取るメソッドの評価よりも前に行われることに注意してください。最初に$1=""があったので、 の最初のインスタンスは次gsubと同等です

gsub(
   /\[quote(?:.*)\](.*?)\[\/quote(?:.*)\]/,
  "<blockquote></blockquote>"
)

これにより$1=が作成"No, but I heard it's short and soft."されるため、 の 2 番目のインスタンスは次のようになりますgsub

gsub(
   /\[quote(?:.*)\](.*?)\[\/quote(?:.*)\]/,
  "<blockquote>No, but I heard it's short and soft.</blockquote>"
)

3回目にすると、再び

gsub(
   /\[quote(?:.*)\](.*?)\[\/quote(?:.*)\]/,
  "<blockquote></blockquote>"
)
于 2012-09-26T03:26:23.303 に答える