3

パラメータを特別なHTMLエンティティの配列(ユーザーが「&」ではなく「&amp」と入力した場合など)に対してチェックし、入力したエンティティの周囲にスパンを追加する関数を作成しようとしています。

これを見つけるために文字列パラメータを検索するにはどうすればよいですか?正規表現でしょうか?

これはこれまでの私のコードです:

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

明らかに、これは機能しません。誰かアイデアはありますか?

したがって、のような文字列My name is &amp;が渡された場合、それはレンダリングされますMy name is <span>&amp;</span>。特殊文字が2回リストされた場合、たとえば'のよう&amp;&amp;&amp;に、各要素の周囲にスパンをレンダリングするだけでよいのです。ユーザーはプレーンも使用できる必要があります&

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;'))

上記は2つのアラートを表示します。最初にfalse、次にtrue。

于 2012-12-07T12:49:16.460 に答える