Используйте регулярное выражение JavaScript для замены числовых сущностей HTML их действительными символами - PullRequest
6 голосов
/ 27 ноября 2010

Я пытаюсь использовать JavaScript и регулярные выражения для замены числовых сущностей HTML их действительными символами Unicode, например,

foo's bar
→
foo's bar

Это то, что я получил до сих пор:

"foo's bar".replace(/&#([^\s]*);/g, "$1"); // "foo39s bar"

Осталось только заменить число на String.fromCharCode($1), но я не могу заставить его работать.Как я могу это сделать?

Ответы [ 4 ]

10 голосов
/ 27 ноября 2010
"foo's bar".replace(/&#(\d+);/g, function(match, match2) {return String.fromCharCode(+match2);})
3 голосов
/ 27 ноября 2010

Помимо использования функции обратного вызова, вы можете рассмотреть возможность добавления поддержки ссылок на шестнадцатеричные символы (ሴ).

Кроме того, fromCharCode может быть недостаточно.Например, 𐤀 является действительной ссылкой на финикийский символ, но поскольку он находится за пределами Базовой многоязычной плоскости, а модель String в JavaScript основана на единицах кода UTF-16, а не на полных символьных точках, fromCharCode(67840) не будет работать.Вам понадобится кодировщик UTF-16, например:

String.fromCharCodePoint= function(/* codepoints */) {
    var codeunits= [];
    for (var i= 0; i<arguments.length; i++) {
        var c= arguments[i];
        if (arguments[i]<0x10000) {
            codeunits.push(arguments[i]);
        } else if (arguments[i]<0x110000) {
            c-= 0x10000;
            codeunits.push((c>>10 & 0x3FF) + 0xD800);
            codeunits.push((c&0x3FF) + 0xDC00);
        }
    }
    return String.fromCharCode.apply(String, codeunits);
};

function decodeCharacterReferences(s) {
    return s.replace(/&#(\d+);/g, function(_, n) {;
        return String.fromCharCodePoint(parseInt(n, 10));
    }).replace(/&#x([0-9a-f]+);/gi, function(_, n) {
        return String.fromCharCodePoint(parseInt(n, 16));
    });
};

alert(decodeCharacterReferences('Hello &#x10900; mum &#67840;!'));
3 голосов
/ 27 ноября 2010
"foo&#39;s bar".replace(/&#([^\s]*);/g, function(x, y) { return String.fromCharCode(y) })

Первый аргумент (x) в текущем примере - «».у 39.

0 голосов
/ 27 ноября 2010

Если вы не хотите определять все сущности, вы можете позволить браузеру сделать это за вас - этот бит создает пустой элемент p, записывает html и возвращает полученный текст.Элемент p никогда не добавляется в документ.

function translateEntities(string){
    var text, p=document.createElement('p');
    p.innerHTML=string;
    text= p.innerText || p.textContent;
    p.innerHTML='';
    return text;
}
var s= 'foo&#39;s bar';
translateEntities(s);

/*  returned value: (String)
foo's bar
*/
...