我希望使用@或#启动的主题标签的正则表达式匹配,而不是包含在html锚标记中。
我的表达式:(@|#)([a-zA-Z_]+)(?!<\/[a])
不起作用,因为在文本中:
<p>@john Olor it amet, consectetuer adipiscing elit.
Aenean commodofadgfsd
<a class="autocompletedTag" href="#" data-id="u:2">@john_wayne</a></p>
匹配@john
和@john_wayne
,但我不想匹配@john_wayne
。
我怎么能这样做?
实施例
在代码中:
<p>@john @kate <a>@royal_baby</a> #england <a>#russia</a></p>
我想匹配@john
,@kate
和#england
,但不 @royal_baby
和#russia
。
在此代码中:
<p>#sale #stack #hello <a>@batman</a> #avengers <a>#iron_man</a></p>
我想匹配#sale
,#stack
,#hello
和#avengers
,但不 @batman
和{{1} }。
答案 0 :(得分:2)
您可以使用以下正则表达式:
/(<a[^>]*>.*?[@#][a-zA-Z_]+.*?<\/a>)|([@#][a-zA-Z_]+)/g
我们的想法是匹配两个案例并使用回调来过滤它们:
input = '<p>@john Olor it amet, consectetuer adipiscing elit.\
Aenean commodofadgfsd \
<a class="autocompletedTag" href="#" data-id="u:2">@john_wayne</a></p>\
<p>@john @kate <a>@royal_baby</a> #england <a>#russia</a></p>\
<p>#sale #stack #hello <a>@batman</a> #avengers <a>#iron_man</a></p>';
matches = new Array(); //empty array
input.replace(/(<a[^>]*>.*?[@#][a-zA-Z_]+.*?<\/a>)|([@#][a-zA-Z_]+)/g, function(all, a, result){
if(result){ // If the second group exists
matches.push(result); // then add it to matches
}
});
document.getElementById('results').innerHTML = matches.join(); // Store results
<强>解释强>
[@#]
:一次匹配@
或#
[a-zA-Z_]+
:匹配字母和下划线一次或多次<a
:匹配<a
[^>]*>
:匹配>
除{0}之外的任何内容,最后匹配>
.*?[@#][a-zA-Z_]+.*?
:匹配<a></a>
ungreedy <\/a>
:匹配结束标记</a>