4

解析 XML 提要时,我从内容标签中获取文本,如下所示:

政府已拨款资助圣尤南学院的一项重大翻新工程。这是上个月宣布将其预制件替换为永久住宿的补充。最新的拨款将允许对学校的一部分进行重大翻新,以便为班级提供新的住宿——该项目还将涉及屋顶维修、安装除尘系统、新的科学室配件和安装坚固的警报器。多尼戈尔副校长乔·麦克休说必须归功于学校的管理委员会

无论如何,是否可以轻松地将这些特殊字符(即 HTML 实体)替换为它们的等效字符,例如撇号等?

编辑:

Ti.API.info("is this real------------"+win.dataToPass)


返回:(为清楚起见添加了换行符)

[INFO][TiAPI   ( 5437)]  Is this real------------------Police in Strabane are
warning home owners and car owners in the town to be vigilant following a recent
spate of break-ins. There has been a number of thefts from gardens and vehicles
in the Jefferson Court and Carricklynn Avenue area of the town. The PSNI have
said that residents have reported seeing a dark haired male in and around the
area in the early hours of the morning. Local Cllr Karina Carlin has been
monitoring the situation – she says the problem seems to be getting
worse…….


我的 external.js 文件在下面,即仅显示上面文本的文件:

var win= Titanium.UI.currentWindow;

Ti.API.info("Is this real------------------"+ win.dataToPass);

var escapeChars = { lt: '<', gt: '>', quot: '"', apos: "'", amp: '&' };

function unescapeHTML(str) {//modified from underscore.string and string.js
    return str.replace(/\&([^;]+);/g, function(entity, entityCode) {
        var match;

        if ( entityCode in escapeChars) {
            return escapeChars[entityCode];
        } else if ( match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if ( match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
}

var newText= unescapeHTML(win.datatoPass);


var label= Titanium.UI.createLabel({
    color: "black",
    //text: win.dataToPass,//this works!
    text:newText,//this is causing an error
    font: "Helvetica",
    fontSize: 50,
    width: "auto",
    height: "auto",
    textAlign: "center"
})

win.add(label);
4

3 回答 3

6

您可以在 Titanium 中包含许多库(Underscore.stringstring.js可以实现这一点,但如果您只想要unescape html功能,只需尝试这段代码,改编自上述库

var escapeChars = { lt: '<', gt: '>', quot: '"', apos: "'", amp: '&' };

function unescapeHTML(str) {//modified from underscore.string and string.js
    return str.replace(/\&([^;]+);/g, function(entity, entityCode) {
        var match;

        if ( entityCode in escapeChars) {
            return escapeChars[entityCode];
        } else if ( match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if ( match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
}

这会将这些特殊字符替换为其人类可读的派生字符并返回修改后的字符串。只需将它放在代码中的某个地方,你就可以了,我自己在 Titanium 中使用过它,它非常方便。

于 2013-07-16T14:46:22.010 回答
1

我遇到了同样的问题,@Josiah Hester 的解决方案对我有用。我添加了一个条件来检查是否只处理字符串值。

    this.unescapeHTML = function(str) {
    var escapeChars = { lt: '<', gt: '>', quot: '"', apos: "'", amp: '&' };
    if(typeof(str) !== 'string'){
        return str;
    }else{
        return str.replace(/\&([^;]+);/g, function(entity, entityCode) {
        var match;
        if ( entityCode in escapeChars) {
            return escapeChars[entityCode];
        } else if ( match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if ( match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }});
    }
};
于 2015-07-17T16:28:38.500 回答
0

下面是对这些特殊字符的两个引用,不幸的是,通过将它们过滤掉,您可能会过滤掉您可能真正想要保留的重要信息。我的建议是使用符号引用表创建一个数组,然后在您的字符串中为每个代码执行搜索,并用它的适当响应替换代码。

例如:

A-Z are represented by: &#65; to &#90;

过滤掉这些信息可能会显着改变您希望阅读的数据。

HTML 符号实体参考:
http ://www.webmonkey.com/2010/02/special_characters/
http://www.w3schools.com/tags/ref_symbols.asp

于 2013-07-16T14:16:15.113 回答