在javascript中,我们返回带有替换符号的行。如果行有链接,则不需要替换链接符号。
为此,我们使用代码:
function Html(text) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
var end_text = text.replace(/[&<>"']/g, function(m) { return map[m]; });
console.log(end_text);
end_text = end_text.replace(/<a href="([\/a-zA-Z\s]+)"(\stitle="[a-zA-Z0-9\s-]+")?(\sclass="[a-zA-Z0-9\s-]*")?>([a-zA-Z\s-]+)<\/a>/g,'<a href="$1"$2$3>$4</a>');
//<a href="$1"$3>$4</a>
return end_text;
}
var str = '<a href="/homepage/test" title="go-go-go">go-go-go</a>';
console.log(Html(str));
首先我们替换行中的符号,而不是我们尝试解码字符串中的链接。但是我们遇到问题:我们得到<a href="/homepage/test" title="go-go-go">go-go-go</a>
而不是<a href="/homepage/test" title="go-go-go">go-go-go</a>
。
哪里有错误以及是否可以改进代码?
答案 0 :(得分:2)
您的正则表达式完全按照您的要求执行:$2
和$3
被自己替换,即包括"
s!
所以我没有看到任何简单的解决方法来实现你想要的方式。
否则你可能会这样做:
(编辑:现在包括一个测试,以便在title
包含“home”时保留编码实体,根据下面的OP评论
function Html(text) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
var end_text = text.replace(/[&<>"']/g, function(m) { return map[m]; });
console.log(end_text);
return end_text.replace(/<a ([\s\S]*?)>([a-zA-Z\s-]+)<\/a>/g,
function(match, tag, content) {
if (/title="[\s\S]*home[\s\S]*"/.test(tag)) {
return match;
}
return '<a ' + tag.replace(/"/g, '"') + '>' +
content.replace(/"/g, '"') + '</a>';
}
);
}
console.log(Html( // should result with plain HTML
'<a href="/homepage/test" title="go-go-go">go-go-go</a>'
));
console.log(Html( // should result keeping encoded entities
'<a href="/homepage/test" title="go-home">go-go-go</a>'
));