0

jQueryオートコンプリート プラグインを使用してメンションを実装した Rails アプリケーションに取り組んでいます。

これは、更新が送信されたときのメンションを含む文字列の例です。

-> こんにちは、 Kenneth Auchenberg さん、お久しぶりです。ピート・レイシーに明日会うと伝えて

サーバー側では、文字列を次のように受け取ります。

-> こんにちは @[Kenneth Auchenberg](user:1) お久しぶりです。@[ピート・レイシー](user:6) 明日彼に会うと伝える

この文字列を処理した後、角括弧内のユーザー名とセミコロンの後のユーザー ID、つまりkenneth Auchenberg、彼の IDを取得し1、 and をプロファイルへのリンクに置き換え@[Kenneth Auchenberg](user:1)@[Pete Lacey](user:6)不要な@,[]を削除し()て、結果の文字列が署名されるようにします。次のようなことができます

-> こんにちは、 Kenneth Auchenberg さん 、お久しぶりです。ピート・レイシーに明日会うと伝えて

これまでのところ、角かっこ内のユーザー名を取得するだけです。

string.scan(/\[([^\]]*)\]/)

それは私に与えます:

[["Kenneth Auchenberg"], ["Pete Lacey "]]

gsubRuby のおよび関数については知ってscanいますが、目的の結果を得ることができません。私はまだRuby正規表現を使用する初心者です。これを行う最善の方法は何ですか?

4

3 に答える 3

1
string = "Hello @[Kenneth Auchenberg](user:1) its been long. Tell @[Pete Lacey](user:6) I will see him tomorrow"

string.scan(/@\[(.*?)\]\(user:(\d+)\)/)

戻り値:

[
  [
    "Kenneth Auchenberg",
    "1"
  ],
  [
    "Pete Lacey",
    "6"
  ]
]
于 2013-06-12T20:13:28.860 に答える
1

関数の書き方を知っていればgsub、正規表現を使用できると確信しています。

@\[([^\]\s]+)([^\]]+)\]\([^\)]+\)

そして、次のように置き換えます。

[$1$2](site.com/user/$1)

ここでテスト済み

部分は\[([^\]\s]+)([^\]]+)\]名前です。後でリンクで使用するユーザー名の 2 つの部分を分離するために、2 つのキャプチャ グループを配置しました。

1 つ目は名をキャプチャし、2 つ目は 2 番目の名前をキャプチャします。次に、置換によってキャプチャ グループがコールバックされ、それらが新しい文字列に配置されます。

于 2013-06-12T20:14:25.473 に答える
1

興味のある正規表現のパターンを明示しているため、この実装は明確で自己文書化されていると思います。

s = 'Hello @[Kenneth Auchenberg](user:1) and @[Pete Lacey](user:6)!!!'

s.gsub! /@\[(?<name>[\w\s]+)\]\(user:(?<userid>\d+)\)/ do
  m = $~ # capture MatchData
  name, id = m[:name], m[:userid] # read the parsed content
  # do anything with them
  ...
  "<a href=\"/user/#{id}\">#{name}</a>" # replace by link
end
于 2013-06-12T20:34:15.883 に答える