正则表达式匹配的主题标签未包含在html标签中

时间:2013-08-14 07:58:17

标签: javascript regex hashtag

我希望使用@或#启动的主题标签的正则表达式匹配,而不是包含在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} }。

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

Online jsfiddle

<强>解释

  • [@#]:一次匹配@#
  • [a-zA-Z_]+:匹配字母和下划线一次或多次
  • <a:匹配<a
  • [^>]*>:匹配>除{0}之外的任何内容,最后匹配>
  • .*?[@#][a-zA-Z_]+.*?:匹配<a></a> ungreedy
  • 之间的内容
  • <\/a>:匹配结束标记</a>