2009-08-04 33 views
5

我正在使用javascript来设置输入的文本,可能包含HTML特定的字符,如& 等输入值所以,我试图找到一个匹配这些值的正则表达式和将它们分别替换为适当的值(“&”,“ ”),只有我无法弄清楚正则表达式。这是我想要做的。做一个对象包含替换值的匹配和参考:javascript正则表达式替换html字符

 
var specialChars = { 
    " " : " ", 
    "&" : "&", 
    ">" : ">", 
    "&lt;" : "<" 
} 

然后,我想匹配我的字符串

 
var stringToMatch = "This string has special chars &amp; and &nbsp;" 

我想是这样

 
stringToMatch.replace(/(&nbsp;|&)/g,specialChars["$1"}); 

但它不起作用。我真的不明白如何捕获特殊标签并将其替换。任何帮助是极大的赞赏。

+0

也许 “& NBSP;”会显示您的 ? – lance 2009-08-04 19:43:28

+0

为什么不使用转义? http://www.w3schools.com/jsref/jsref_escape.asp – Joel 2009-08-04 19:46:57

+0

转义会将&转换为%26amp%3B。绝对不是我寻找的东西 – brad 2009-08-04 20:36:31

回答

15

我认为你可以使用功能从一个稍微不同的主题(Efficiently replace all accented characters in a string?)的问题。

杰森鹀的回答有一些很好的想法+必要的解释,这里是他的一些修改,让你开始(解决方案,如果你有所帮助,给予好评他原来的答复为好,因为这是他的代码,基本上 )。

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g, 
     translate = { 
      'nbsp': String.fromCharCode(160), 
      'amp' : '&', 
      'quot': '"', 
      'lt' : '<', 
      'gt' : '>' 
     }, 
     translator = function($0, $1) { 
      return translate[$1]; 
     }; 

    return function(s) { 
     return s.replace(translate_re, translator); 
    }; 
})(); 

调用作为

var stringToMatch = "This string has special chars &amp; and &amp;nbsp;"; 
var stringOutput = replaceHtmlEntites(stringToMatch); 

编号entites的是更容易,你可以更一般地用一些数学和String.fromCharCode()替换它们。


另外,更简单的可能性会是这样(在任何浏览器的工作原理)

function replaceHtmlEntites(string) { 
    var div = document.createElement("div"); 
    div.innerHTML = string; 
    return div.textContent || div.innerText; 
} 

replaceHtmlEntites("This string has special chars &lt; &amp; &gt;"); 
// -> "This string has special chars < & >" 
1

您可以使用一个函数来替换老做你想做的事:

var myString = '&'+'nbsp;&'+'nbsp;&tab;&copy;'; 
myString.replace(/&\w+?;/g, function(e) { 
    switch(e) { 
     case '&nbsp;': 
      return ' '; 
     case '&tab;': 
      return '\t'; 
     case '&copy;': 
      return String.fromCharCode(169); 
     default: 
      return e; 
    } 
}); 

不过,我劝你要考虑你的情况。如果您收到& nbsp;和&拷贝;和其他HTML实体在你的文本值,你真的想要替换它们吗?之后你应该转换它们吗?

只是要记住。

干杯!

+1

这比上面接受的答案更直接,而且我相信随着更多的实体被添加到列表中,这个规模会更好,这是很重要的,因为命名实体列表是超长的。你得到了抢劫的儿子! – Toby 2011-04-06 00:35:49

2

另一种方法是创建一个div对象

var tmp = document.createElement("div"); 

然后分配文字的innerHTML

tmp.innerHTML = mySpecialString; 

最后读元素的文本内容

var output = tmp.textContent || tmp.innerText //for IE compatibility 

有你去...