[英]Javascript, Use a regex to replace content outside of HTML tags only
我试图用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, function($0,$1){
return $1 ? $0 : '<img src="images/user.png">';
});
我的正则表达式是"( )?John"
。
该模式按照我想要的方式工作,但是将匹配项应用于标签数据,而这并不是我想要的。
因此,我们的想法是忽略标记<
和>
之间的所有内容,并忽略: John
。
能做到吗
该正则表达式将与John
匹配,前提是它位于字符串的开头或结尾,并且/或者在两边都有空格。
正则表达式以匹配John: (?:\\s| |^)(John)(?=\\s|\\r|\\n|$)
此正则表达式合并了最后一个正则表达式,并且还匹配所有html标签和纯文本url。 这里的顺序很重要,因为John
仅在html标记之外或未嵌入URL的情况下才匹配。
正则表达式: https?:\\/\\/[^\\s]*|<\\/?\\w+\\b(?=\\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\\s>]*|[^>])*>|\\ John|(John)
如果您使用了最后一个正则表达式并将其传递给函数,则只有位于标记和网址之外的John
会被替换为字符串。
工作示例: http : //repl.it/J4T
码
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;
});
产量
<span name="John" funnytag:John><img src="images/user.png"> <img src="images/user.png"> John Doe<img src="images/user.png"> <img src="images/user.png">Doe Mr.<img src="images/user.png">Doe http://cool.guy.john/LikesKittens</span>
如果我的理解正确,就是说您要替换与正则表达式匹配的任何内容,只要它不包含在标记中即可,即John和可能的前一个不间断空格将替换为function($0,$1)
除非它出现在HTML代码中?
如果是这样,则可以将此后向断言添加到正则表达式的开头: (?<!<[^>]*?)
。 这告诉正则表达式如果从匹配中向后读取,则在遇到>之前没有遇到< ,从而匹配该模式。
这将是您的代码:
var regex = new RegExp('(?<!<[^>]*?)( )?' + user,'g');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.