Javascript 选择“A”之后的所有文本#&引用;带正则表达式的符号

Javascript 选择“A”之后的所有文本#&引用;带正则表达式的符号,javascript,jquery,regex,Javascript,Jquery,Regex,我使用了一些混合了javascript和正则表达式的jQuery: $(function() { var regExp = new RegExp("\\b(" + "hashtag" + ")\\b", "gm"); var boxLink = "<a class='taglink' onClick='tagBox()'>$1</a>" var html = $('body').html(); $('body').html(html.rep

我使用了一些混合了javascript和正则表达式的jQuery:

$(function() {
    var regExp = new RegExp("\\b(" + "hashtag" + ")\\b", "gm");
    var boxLink = "<a class='taglink' onClick='tagBox()'>$1</a>"
    var html = $('body').html();
    $('body').html(html.replace(regExp, boxLink));
});

function tagBox() {
    alert("It works!")
};
$(函数(){
var regExp=new regExp(“\\b”(“+”hashtag“+”)\\b“,”gm”);
var boxLink=“$1”
var html=$('body').html();
$('body').html(html.replace(regExp,boxLink));
});
函数标记框(){
警报(“它起作用了!”)
};
基本上,只要出现“hashtag”一词,它就会将$1应用到任何地方。Tagbox只会显示一个警告,说明它有效。很简单。我想做的更改是,它不会选择单词“hashtag”,而是选择前面带有“#”符号的所有单词

我如何完成这一点并将其应用到上面的脚本中


提前谢谢

试试这样的东西

var regExp = new RegExp("(#\w+)", "gm");
如果要选择不带#的单词,请将其移动到(

首先,
$('body').html(html)前面
这是一个非常糟糕的主意。您将重新创建DOM,以前绑定到旧结构中的节点的任何事件侦听器都将不再起作用。逐节点遍历DOM节点是一个更好的主意。类似这样的方法应该可以做到:

// Douglas Crockford's WalkTheDOM
function walkTheDOM(node, func) {
  func(node);
  node = node.firstChild;
  while (node) {
    walkTheDOM(node, func);
    node = node.nextSibling;
  }
}

function esc(text) {
  return text.replace(/[&<>"'`]/g, function (chr) {
    return '&#' + chr.charCodeAt(0) + ';'
  })
}

walkTheDOM(document.body, function (node) {
  if (node.nodeType === 3) {
    var html = ''
    // The even indexes contain the hashtags; the odd indexes contain
    // the text that appears between one hashtag and the next.
    // 
    // > 'This post is tagged #javascript and #jquery'.split(/(#\w+)/)
    // ["This post is tagged ", "#javascript", " and ", "#jquery", ""]
    // 
    // Text must be escaped before being inserted via `.html()`.
    $.each(node.textContent.split(/(#\w+)/), function (idx, text) {
      html += idx % 2 ? esc(text) : '<a class="taglink">' + esc(text) + '</a>'
    })
    $(node).parent().html(html)
  }
})
//道格拉斯·克罗克福德的步行区
函数walkTheDOM(节点,func){
func(节点);
node=node.firstChild;
while(节点){
漫游域(节点,函数);
node=node.nextSibling;
}
}
功能esc(文本){
返回文本。替换(/[&“`]/g,函数(chr){
返回“&#”+chr.charCodeAt(0)+”
})
}
walkTheDOM(document.body、function(node){
if(node.nodeType==3){
var html=''
//偶数索引包含哈希标记;奇数索引包含
//显示在一个标签和下一个标签之间的文本。
// 
//>'这篇文章被标记为#javascript和#jquery'。拆分(/(#\w+/)
//[“此帖子已标记”、“#javascript”、“和”、“#jquery”、“”]
// 
//文本必须先转义,然后才能通过“.html()”插入。
$.each(node.textContent.split(/(#\w+/),函数(idx,text){
html+=idx%2?esc(文本):“”+esc(文本)+”
})
$(节点).parent().html(html)
}
})

此代码未经测试,无疑存在一些错误,但希望我能说服您,此问题比最初出现的问题更难解决。

我喜欢您使其更干净的方法。是的,$('body').html(html)太糟糕了。我试图复制/粘贴你的脚本,但它没有突出显示任何哈希标记,我对它的理解还不够透彻,无法调试。问题是:我决定重新创建DOM。坏主意。回到这里,你比我领先了一步,可能更多。谢谢!标记为答案。酷。(很抱歉,我错过了你之前的评论。)