1

我正在尝试在 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

可以做到吗?

4

2 回答 2

2

描述

John如果它位于字符串的开头或结尾和/或两侧都有空格,则此正则表达式将匹配。

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

此正则表达式包含最后一个正则表达式,并且还匹配所有 html 标记和纯文本 url。这里的顺序很重要,因为John只有在 html 标记之外或未嵌入 URL 时才会匹配。

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

如果您采用最后一个正则表达式并将其传递给您的函数,那么只有John标签和 url 之外的 s 将被替换为字符串。

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>

于 2013-06-29T02:16:57.267 回答
0

如果我理解正确,你是说你想替换任何匹配正则表达式的东西,只要它不包含在标签中,即约翰和可选的前面的不间断空格将被替换为返回值,function($0,$1) 除非它出现在里面HTML 标记?

如果是这样,您可以将此后向断言添加到您的正则表达式的开头:(?<!<[^>]*?)。如果从匹配中向后读取它没有遇到<在遇到>之前,这会告诉正则表达式匹配模式。

这将是您的代码:

var regex = new RegExp('(?<!<[^>]*?)(&nbsp;)?' + user,'g');
于 2013-06-28T23:39:30.360 回答