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>");

但一个错误是它没有像它应该的那样在包装中包含#。它似乎输出:

"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”代表“global”)。如果没有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 回答