如何从字符串解码链接



在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-Zs]+)&quot;(stitle=&quot;[a-zA-Z0-9s-]+&quot;)?(sclass=&quot;[a-zA-Z0-9s-]*&quot;)?&gt;([a-zA-Zs-]+)&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>.

哪里有错误,是否有可能改进代码?

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

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

否则,您可能会执行以下操作:
(编辑:根据OP下面的评论,现在包括一个测试,当title包含"家"时保留编码实体)

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 ([sS]*?)&gt;([a-zA-Zs-]+)&lt;/a&gt;/g,
    function(match, tag, content) {
      if (/title=&quot;[sS]*home[sS]*&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>'
));

最新更新