4

すべてのハッシュタグ(英数字とアンダースコアとハイフン)のテキストを検索し、検索などのスパンタグでラップするにはどうすればよいですか

some_string = "this is some text with 3 hashtags #Tag1 and #tag-2 and #tag_3 in it"

そしてそれを次のように変換します:

"this is some text with 3 hashtags <span>#Tag1</span> and <span>#tag-2</span> and <span>#tag_3</span> in it"

私はこれまでのところこれを持っています:

    some_string = some_string.replace(/\(#([a-z0-9\-\_]*)/i,"<span>$1</span>");

しかし、1 つの欠点は、必要なようにラッピングに # が含まれていないことです。出力されるようです:

"this is some text with 3 hashtags <span>Tag1</span> and #tag-2 and #tag_3 in it "

また、最初に見つかったハッシュタグのみを検出し (例:#Tag1このサンプル)、すべてを検出する必要があります。

また、ハッシュタグは # の後に最低 1 文字必要です。したがって、 # だけでは一致しないはずです。

ありがとう

4

4 に答える 4

10

この置換呼び出しを試してください:

編集:http://site.com/#tag文字列の種類をスキップしたい場合は、次を使用します:

var repl = some_string.replace(/(^|\W)(#[a-z\d][\w-]*)/ig, '$1<span>$2</span>');
于 2013-07-25T17:17:07.757 に答える
5

これはあなたが望む正規表現です:

/(#[a-z0-9][a-z0-9\-_]*)/ig

これiにより、大文字と小文字が区別されなくなります。ただし、gは文字列全体を調べます (「g」は「グローバル」を表します)。がないg場合、マッチングは最初の一致で停止します。

これには、不適切な括弧と不要なバックスラッシュを削除するための修正も含まれています。

于 2013-07-25T17:21:12.730 に答える
1

を一致させたくない場合はhttp://site/#hashs、代わりにこれを使用してください*:

string.replace(/(^|\s)#[a-zA-Z0-9][\w-]*\b/g, "$1<span>$2</span>");

一致します:

  • #word
  • #word_1#word-1
  • #word#word?または#word"または#word.または_#word,

似合わない

  • "#word,#word_.#word
  • /#word
  • #_wordまたは#-word
  • wor#d

一致させたいものと一致させたくないものは、場合によって異なる場合があります。

regex101で試してみてください。


* @anubhava によって投稿された現在受け入れられている回答は、URL ハッシュをスキップすると主張していますが、失敗しています。

于 2017-01-02T01:05:18.300 に答える
0

複数行および非ラテン記号で機能するソリューション:

var getHashTags = function(string) {
   var hashTags, i, len, word, words;
   words = string.split(/[\s\r\n]+/);
   hashTags = [];
   for (i = 0, len = words.length; i < len; i++) {
     word = words[i];
     if (word.indexOf('#') === 0) {
       hashTags.push(word);
     }
   }
   return hashTags;
};

またはCoffeeScriptで:

getHashTags = (string) ->
  words = string.split /[\s\r\n]+/
  hashTags = []
  hashTags.push word for word in words when word.indexOf('#') is 0
  hashTags
于 2015-08-17T11:39:55.077 に答える