使用Javascript和正则表达式替换HTML字符

3
谢谢您的帮助。
我需要在一个应用程序中删除所有HTML字符,并将它们替换为它们的HTML数字等价物。
例如:
‡, •, -, ‰, € and ™

成为:

‡, •, -, ‰, € and ™

现在有很多问题,但是这些问题是相反的。

我在一个JSON对象中拥有要转换的所有字符(这只是一个更大列表的快照,只是为了证明我的JSON是好的):

{"ch":"‘","sub":"‘"},
{"ch":"’","sub":"’"},
{"ch":"‚","sub":"‚"},
{"ch":"“","sub":"“"},
{"ch":"”","sub":"”"},
{"ch":"„","sub":"„"},
{"ch":"†","sub":"†"},
{"ch":"‡","sub":"‡"},
{"ch":"•","sub":"•"},
...

我目前使用 Prototype 循环并尝试替换它们:

oJSONItems.each(function(o){
    var oRG = new RegExp(o.ch,'g');
    oText = oText.replace(oRG,o.sub);
});

有些正在被替换,但有些则不是...
‡
•
-
‰
€
™

最重要的是我需要知道像这样的字符为什么无法转换。

谢谢。

1个回答

2

不要为特定实体编写代码,如果能替换原始7位ASCII范围之外的任何字符会更好:

str = str.replace(/[^\011\012\015\040-\177]/g, function(x) {
    return '&#' + x.charCodeAt(0) + ';'
})

这个正则表达式匹配任何非空格或“普通”ASCII字符。

或者,可以编写一个映射,使成为您想要替换的字符,成为实体:

var map = { '£' : '£' }

str = str.replace(/./g, function(x) {
    return (x in map) ? map[x] : x;
});

请注意,这两个版本仅对您集合中的每个可能实体调用一次正则表达式,而不是为每个实体都调用一次。这应该使代码比基于循环的方法稍微快一些。

@Qtax,它可以在16位Unicode集上正常工作,但可能无法在扩展集上正常工作。 - Alnitak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接