我找到了很多正则表达式示例来从文本中检索主题标签。不幸的是,没有一个例子是我需要的。
这几乎是我所需要的......但
function hashtags(text) {
return text.replace(/(^|\s)#(\w*[a-zA-Z]+\w{2,50})/g,
"$1<a href='/h/$2' target='_blank'>#$2</a>");
}
Hashtags不能以数字开头,以避免例如第12节被哈希处理的情况。
上面的示例检查它,但它不允许像ÁÉÍÚ这样的字符,它不能正确检查#标签长度,并且不允许字符' - '。
所以,我需要以下内容:
主题标签可以以任何字母开头--A,z,B,Ñ,ó,Ú等,但不能带有数字而不带特殊符号&amp;%$或 - _
< / LI>主题标签的总长度必须为3-50个字符。正则表达式必须只接受完整单词作为主题标签,但不能在前50个字符后删除它们。因此,必须忽略以#开头但包含超过50个字符的单词,而不是将前50个字符转换为主题标签链接。在我的示例中,{2,50}
无效。
主题标签的其余部分(如果选中它不以数字或特殊符号开头)可能包含数字,任何字母和_ -
符号。 \w
仅允许_
,但不允许-
有可能吗?
答案 0 :(得分:0)
对于1 - 你需要一个角色类。您可以使用方括号定义它们。 PCRE定义IBDesignable
,但也包括数字。
For 2 - 你可以有一个单词后跟'some whitespace'(PCRE:\w
)或者使用环绕模式\s
- 来表示'没有跟着它。
对于3 - 非空格可能是您想要的 - {PCR定义中的(?![A-Z0-9])
。
\S
编辑:鉴于这可能是javascript特定的,你不能使用lookbehind,那么以上可能不适合你。如果要将我们的正则表达式查询绑定到特定语言,则在问题中指定该约束很有用。
答案 1 :(得分:0)
试试这个:
/(^|\s)#([^\d&%$_-]\S{2,49})\b/g
解释
(^|\s) #
#([^\d&%$_-] # not the characters you mentioned in the first position
\S{2,49}) # the first chracter was already matched
\b # a boundary to avoid overflow 50 characters
希望它有所帮助。