JavaScript正则表达式,搜索主题标签

时间:2013-07-25 17:10:25

标签: javascript regex

如何在一些文本中搜索任何和所有主题标签(字母数字和下划线和连字符)并将其包装在span标签中 例如搜索

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 个答案:

答案 0 :(得分:9)

试试这个替换电话:

编辑:如果您想跳过http://site.com/#tag种字符串,请使用:

var repl = some_string.replace(/(^|\W)(#[a-z\d][\w-]*)/ig, '$1<span>$2</span>');

答案 1 :(得分:4)

这是你想要的正则表达式:

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

i使其不区分大小写,您已经拥有它。但g使整个字符串看起来(“g”代表“全局”)。如果没有g,匹配将在第一场比赛时停止。

这还包括修复删除不正确的括号和一些不需要的反斜杠。

答案 2 :(得分: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

答案 3 :(得分:0)

如果您不想匹配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 hash,但却没有成功。