Javascript,仅使用正则表达式替换HTML标记之外的内容
我试图用JavaScript编写一个正则表达式来替换HTML标记外的字符串,并忽略HTML标记内的字符串 以下是我的JavaScript代码:Javascript,仅使用正则表达式替换HTML标记之外的内容,javascript,regex,Javascript,Regex,我试图用JavaScript编写一个正则表达式来替换HTML标记外的字符串,并忽略HTML标记内的字符串 以下是我的JavaScript代码: var content = "Hi, my <span user="John">name</span> is John"; var user = 'John'; var regex = new RegExp('( )?' + user,'g'); content.replace(regex,
var content = "Hi, my <span user="John">name</span> is John";
var user = 'John';
var regex = new RegExp('( )?' + 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('(?<!<[^>]*?)( )?' + 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 John DoeJohn JohnDoe Mr.JohnDoe http://cool.guy.john/LikesKittens</span>";
var rePattern = /https?:\/\/[^\s]*|<\/?\w+\b(?=\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>])*>|\ 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。我会自己解决它,但它是太复杂的表达我的知识。更新,以涵盖您的例子。非常感谢!工作完美!这是什么魔法?我无法理解这是多么美妙。它工作得很好。你是个巫师。再次感谢!