2016-02-29 52 views
0

在javascript中,我们返回带有替换符号的行。如果行有链接,则不需要替换链接。如何从字符串解码链接?

为此,我们使用代码:

function Html(text) { 
    var map = { 
     '&': '&', 
     '<': '&lt;', 
     '>': '&gt;', 
     '"': '&quot;', 
     "'": '&#039;' 
    }; 

    var end_text = text.replace(/[&<>"']/g, function(m) { return map[m]; }); 
    console.log(end_text); 
    end_text = end_text.replace(/&lt;a href=&quot;([\/a-zA-Z\s]+)&quot;(\stitle=&quot;[a-zA-Z0-9\s-]+&quot;)?(\sclass=&quot;[a-zA-Z0-9\s-]*&quot;)?&gt;([a-zA-Z\s-]+)&lt;\/a&gt;/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=&quot;go-go-go&quot;>go-go-go</a>而不是<a href="/homepage/test" title="go-go-go">go-go-go</a>

哪里出错,是否有可能改善代码?

+0

'/ [&<>“'] /'正在替换,也许会在你做href正则表达式后替换。 – sln

回答

2

您的正则表达式完全按照您的要求:$2$3被自己替换,即包括&quot; s!

所以我没有看到任何简单的解决方案来实现你想要的方式。

否则你可能会做这样的事情:
(编辑:现在包括一个测试,以保持编码实体时title包括“家”,根据下面的OP的评论)

function Html(text) { 
 
    var map = { 
 
    '&': '&amp;', 
 
    '<': '&lt;', 
 
    '>': '&gt;', 
 
    '"': '&quot;', 
 
    "'": '&#039;' 
 
    }; 
 

 
    var end_text = text.replace(/[&<>"']/g, function(m) { return map[m]; }); 
 
    console.log(end_text); 
 
    return end_text.replace(/&lt;a ([\s\S]*?)&gt;([a-zA-Z\s-]+)&lt;\/a&gt;/g, 
 
    function(match, tag, content) { 
 
     if (/title=&quot;[\s\S]*home[\s\S]*&quot;/.test(tag)) { 
 
     return match; 
 
     } 
 
     return '<a ' + tag.replace(/&quot;/g, '"') + '>' + 
 
     content.replace(/&quot;/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>' 
 
));

+0

我明白,thx) – Nik

+0

你能帮忙吗 - 如何在条件中添加word-exception '([a-zA-Z \ s - ] +)'?即该字符串'var str ='go-go-go';'在这种情况下无法处理。 'home' - 单词例外,如果文本链接有他,替换不应该工作。如何做到这一点? – Nik

+0

@Nik我不明白:如果'title'包含“home”,你的意思是你想要第二个'.replace()'不被执行? – cFreed