如何从字符串解码链接?

时间:2016-02-29 22:40:20

标签: javascript regex

在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>

哪里有错误以及是否可以改进代码?

1 个答案:

答案 0 :(得分:2)

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

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

否则你可能会这样做:
(编辑:现在包括一个测试,以便在title包含“home”时保留编码实体,根据下面的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>'
));