[英]JavaScript regex, searching for hashtags
如何在一些文本中搜索任何和所有主题标签(字母数字和下划线和连字符)并将其包装在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
标签(例如,此示例中的#Tag1
),它应该检测所有。
此外,我需要#标签后至少有1个字符。 所以#本身不应该匹配。
谢谢
试试这个替换电话:
编辑:如果你想跳过http://site.com/#tag
类型的字符串然后使用:
var repl = some_string.replace(/(^|\W)(#[a-z\d][\w-]*)/ig, '$1<span>$2</span>');
这是您想要的正则表达式:
/(#[a-z0-9][a-z0-9\-_]*)/ig
i
使它不区分大小写,你已经拥有它。 但是g
使它看起来整个字符串(“g”代表“全局”)。 没有g
,匹配在第一场比赛时停止。
这还包括修复删除不正确的括号和一些不需要的反斜杠。
适用于多行和非拉丁符号的解决方案:
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
如果您不想匹配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
nor ,#word
nor .#word
/#word
#_word
也不是#-word
wor#d
您想要和不想匹配的内容可能会因情况而异。
在regex101自己试试吧。
* @anubhava发布的当前接受的答案声称跳过url hash,但没有做到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.