繁体   English   中英

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

[英]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 &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">';
});

我的正则表达式是"(&nbsp;)?John"

该模式按照我想要的方式工作,但是将匹配项应用于标签数据,而这并不是我想要的。

因此,我们的想法是忽略标记<>之间的所有内容,并忽略: &nbsp;John

能做到吗

描述

该正则表达式将与John匹配,前提是它位于字符串的开头或结尾,并且/或者在两边都有空格。

正则表达式以匹配John: (?:\\s|&nbsp;|^)(John)(?=\\s|\\r|\\n|$)

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

正则表达式: https?:\\/\\/[^\\s]*|<\\/?\\w+\\b(?=\\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\\s>]*|[^>])*>|\\&nbsp;John|(John)

如果您使用了最后一个正则表达式并将其传递给函数,则只有位于标记和网址之外的John会被替换为字符串。

Javascript范例

工作示例: http : //repl.it/J4T

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;
});

产量

<span name="John" funnytag:John><img src="images/user.png"> <img src="images/user.png"> &nbsp;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('(?<!<[^>]*?)(&nbsp;)?' + user,'g');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM