Javascript,仅使用正则表达式替换HTML标记之外的内容

Javascript,仅使用正则表达式替换HTML标记之外的内容,javascript,regex,Javascript,Regex,我试图用JavaScript编写一个正则表达式来替换HTML标记外的字符串,并忽略HTML标记内的字符串 以下是我的JavaScript代码: var content = "Hi, my <span user="John">name</span> is &nbsp;John"; var user = 'John'; var regex = new RegExp('(&nbsp;)?' + user,'g'); content.replace(regex,

我试图用JavaScript编写一个正则表达式来替换HTML标记外的字符串,并忽略HTML标记内的字符串

以下是我的JavaScript代码:

var content = "Hi, my <span user="John">name</span> is &nbsp;John";
var user = 'John';
var regex = new RegExp('(&nbsp;)?' + user,'g');
content.replace(regex, function($0,$1){
    return $1 ? $0 : '<img src="images/user.png">';
});
var content=“嗨,我叫约翰”;
var user='John';
var regex=new RegExp(“()?”+用户,'g');
替换(正则表达式,函数($0,$1){
返回$1?$0:“”;
});
我的正则表达式是
“()?John”

该模式按照我想要的方式工作,但它将匹配应用于标记数据,这是我不想要的

因此,我们的想法是忽略标记之间的所有内容:
,忽略:
John


可以这样做吗?

如果我理解正确,您是说您希望替换任何与正则表达式匹配的内容,只要它不包含在标记中,即John,并且可以选择将前面的非中断空格替换为
函数的返回值($0,$1)
,除非它出现在HTML标记中

如果是这样,您可以将这个look-behind断言添加到正则表达式的开头:
(?]*?)
。这告诉正则表达式,如果从匹配中向后读取时,它在遇到strong>之前没有遇到,则要匹配该模式

这将是您的代码:

var regex = new RegExp('(?<!<[^>]*?)(&nbsp;)?' + user,'g');
var regex=newregexp('(?]*?)()?'+用户,'g');
说明 该正则表达式将匹配
John
,前提是它位于字符串的开头或结尾,并且/或者两边都有空格

要匹配John的正则表达式:
(?:\s | ^)(John)(?=\s |\r | \n |$)

这个正则表达式合并了最后一个正则表达式,还匹配所有html标记和纯文本URL。这里的顺序很重要,因为
John
仅在html标记之外或未嵌入URL的情况下匹配

正则表达式:
https?:\/\/[^\s]*.|)(?:='[^']*'.[^']*.[^']*.[^\s>]*>.[^\s>].\124;\ John(John)

如果使用最后一个正则表达式并将其传递给函数,则只有标记和URL之外的
John
s将被替换为字符串

Javascript示例 工作示例:

代码

var content = "<span name=\"John\" funnytag:John>John John &nbsp;John DoeJohn JohnDoe Mr.JohnDoe http://cool.guy.john/LikesKittens</span>";
var rePattern = /https?:\/\/[^\s]*|<\/?\w+\b(?=\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>])*>|\&nbsp;John|(John)/gi;

content.replace(rePattern, function(match, capture) {
    return capture ? "<img src=\"images/user.png\">" : match;
});
var content=“约翰·多约翰·约翰多约翰·约翰多先生http://cool.guy.john/LikesKittens";
var-rePattern=/https?:\/\/[^\s]*.|)(?:='[^']*'.[^']*.[^']*.[^\s>]*>.[^\s>].*>约翰(约翰)/gi;
内容.替换(重模式,函数(匹配,捕获){
返回捕获?“:匹配;
});
输出


John Doe Doe Doe先生http://cool.guy.john/LikesKittens

。您可能应该尝试从输入字符串创建DOM,然后仅在文本节点上迭代。@m.buettner是正确的;正则表达式不是解析html的正确工具。如果使用javascript库,将字符串解析为dom节点非常容易。例如,jquery有一个很好的解析函数:我发现您希望用图像替换出现的每个单词
John
,除了那些在属性内部的。是这样吗?或者,是否需要在单词
之前加一个
(比如
#
是twitter的标签)?@acdcjunior他替换所有前面没有
Filip的文本实例,你能提供一些想要的输出来匹配你的示例文本吗?Javascript不支持lookbehindsWorks几乎很棒:)。一个问题是,John只有在被空格包围时才会被替换。例如,
John
JohnDoe
不被替换。另一个问题是,当我有“John”或
John
时,替换图像会删除John前面的空间。还有一件事,“约翰”应该保持原样。我在问题中给出的示例是替换每个“John”,除了以
开头的一个,其思想是继续使用相同的模式,加上忽略标记中的John。我会自己解决它,但它是太复杂的表达我的知识。更新,以涵盖您的例子。非常感谢!工作完美!这是什么魔法?我无法理解这是多么美妙。它工作得很好。你是个巫师。再次感谢!