3

我正在尝试编写一个函数,根据一组特殊的 HTML 实体(例如用户输入的 '&' 而不是 '&')检查参数,然后在这些输入的实体周围添加一个跨度。

我将如何搜索字符串参数来找到它?它会是一个正则表达式吗?

到目前为止,这是我的代码:

 function ampersandKiller(input) {
 var specialCharacters = ['&', ' ']
 if($(specialCharacters).contains('&')) {
     alert('hey')
 } else {
     alert('nay')
 }
}

显然这是行不通的。有没有人有任何想法?

因此,如果传递了一个类似的字符串My name is &amp;,它将呈现My name is <span>&amp;</span>. 如果一个特殊字符被列出两次——比如'我真的很喜欢&amp;&amp;&amp;它只会渲染每个元素周围的跨度。用户还必须能够使用 plain &

4

3 回答 3

3
function htmlEntityChecker(input) {
    var characterArray = ['&amp;', '&nbsp;'];
    $.each(characterArray, function(idx, ent) {
        if (input.indexOf(ent) != -1) {
            var re = new RegExp(ent, "g");
            input = input.replace(re, '<span>' + ent + '</span>');
        }
    });

    return input;
}

小提琴

于 2012-12-07T12:38:24.183 回答
2

您可以使用此正则表达式来查找和包装实体:

input.replace(/&amp;|&nbsp;/g, '<span>$&</span>')

对于任何类型的实体,您也可以使用它:

input.replace(/&(?:[a-z]+|#\d+);/g, '<span>$&</span>');

它匹配“单词”实体以及数字实体。例如:

'test & &amp; &#60;'.replace(/&(?:[a-z]+|#x?\d+);/gi, '<span>$&</span>');

输出:

test & <span>&amp;</span> <span>&#60;</span>
于 2012-12-07T12:38:08.653 回答
0

另一种选择是让浏览器为您进行解码并检查长度是否有任何不同......检查这个问题以查看如何取消实体的转义。然后,您可以将原始字符串的长度与解码后的长度进行比较。下面的例子:

function htmlDecode(input){
    var e = document.createElement('div');
    e.innerHTML = input;
    return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}
function hasEntities(input) {
    if (input.length != htmlDecode(input).length) {
       return true;
    }
    return false;
}
alert(hasEntities('a'))
alert(hasEntities('&amp;'))

上面将显示两个警报。先假后真。

于 2012-12-07T12:49:16.460 回答