0

重複の可能性:
JavaScript の特殊文字列の削除が機能しない

Google アナリティクスに送信される動的に入力される値に含まれる特殊文字を削除しようとしています。「Matt's」などの一部の製品の ' が JS エラーを引き起こしています。

私は JavaScript や JSP をよく理解していないので、これは特に困難です。次のコードを記述しましたが、目的の結果が得られません。これを行う別の方法はありますか?カスタム変数とアンカー タグで直接 _trackEvent を呼び出すために、これを変更する必要があります。以下は、カスタム変数のコードです。

                <script type="text/javascript">
                function removeSplChars(inStr) {
                inStr = inStr.replace(/[^a-zA-Z0-9 ]/g, "");
                return inStr;
                }
                var _gaq = _gaq || [];
                _gaq.push(['_setAccount', '<c:out value="${profileId}"/>']);
                <c:choose>
                <c:when test="${(lastCmdName eq 'CategoryDisplay') or (lastCmdName eq 'ProductDisplay')}" >
                _gaq.push(['_setCustomVar',
                2, // This custom var is set to slot #2.
                '<c:choose><c:when test="${WCParam.source eq 'search'}">Search</c:when><c:otherwise><c:out value="${topCat}" /></c:otherwise></c:choose>', // The top-level name for your online content categories.
                '<c:choose><c:when test="${WCParam.source eq 'search'}">Search <c:out value="${WCParam.searchTerm}" /></c:when><c:otherwise><c:out value="${topCat}" />|<c:out value="${subCatA}" />|<c:out value="${subCatB}" />|<c:out value="${subCatC}" /></c:otherwise></c:choose>', // Records value of breadcrumb name
                3 // Sets the scope to page-level.
                ]); 
                </c:when>
                <c:otherwise>
                </c:otherwise>
                </c:choose>
                removeSplChars('<c:out value="${topCat}" />', '<c:out value="${subCatA}" />', '<c:out value="${subCatB}" />', '<c:out value="${subCatC}" />');
                 _gaq.push(['_trackPageview']);
                (function() {
                var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
                ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
                var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
                })();
                </script>

例を挙げると、 // Records value of breadcrumb nameとコメントされている行で、 Google は次のようなコードを出力しています:

[2,Kitchen Tools,Kitchen Tools|Textiles|Chef& # 0 3 9 ; s Apron|,3]" (もちろん、記号の間にスペースはありません)

私が探しているのは
[2,キッチン ツール,キッチン ツール|テキスタイル|シェフ エプロン|,3]"

ステートメントに escapeXml="false" を追加しようとしましたが、詳細のない「予期しない識別子」エラーが表示されます。

今、私は以下のコードも試しました。特殊文字をテストに置き換えることを期待していますが、何も起こりません。

                    <script type="text/javascript" src="<c:out value="${jspStoreImgDir}javascript/Util.js"/>">
                    String.prototype.unescapeHtml = function () {
                        var temp = document.createElement("li");
                        temp.innerHTML = this;
                        var result = temp.childNodes[0].nodeValue;
                        temp.removeChild(temp.firstChild);
                        return result;}
                    '<c:out value="${catNameDisplay}" />'.unescapeHtml().replace((/[^a-zA-Z0-9 ]/g, 'test');

                    </script>

どんな助けでも大歓迎です。私は一日中これに取り組んできましたが、解決策が見つかりません。

4

3 に答える 3

0

すみません、前の回答はばかげていました。謝罪します。正反対のことをするべきだった。

ここで気づいたことの 1 つは、メソッドに複数の引数を渡している可能性があることですremoveSplChars。関数が構造化されている方法では、最初の文字列のみが修正されます。

また..「固定」文字列が返されますが、インラインで固定されると想定しています

あなたは次のようなことをしています:

removeSplChars(arg1, arg2, arg3, arg4);

arg1arg2arg3、およびが固定されていることを期待してarg4いますが、そうではありません。より良いです:

arg1 = removeSplChars(arg1);
arg2 = removeSplChars(arg2);
arg3 = removeSplChars(arg3);
arg4 = removeSplChars(arg4);

わかりましたので、これで問題が解決するはずです。楽しむ!

于 2012-10-05T19:34:54.923 に答える
0
String.prototype.unescapeHtml = function () {
    var temp = document.createElement("div");
    temp.innerHTML = this;
    var result = temp.childNodes[0].nodeValue;
    temp.removeChild(temp.firstChild);
    return result;
}

'&#039'.unescapeHtml().replace(/[^0-9a-zA-Z]/gi, '');

http://paulschreiber.com/blog/2008/09/20/javascript-how-to-unescape-html-entities/から unescapeHtml コードを取得し、エスケープ解除後に正規表現を適用して特殊文字を削除しました。

やってみて。変数に使用できる文字列を置き換えるだけです。

于 2012-10-05T20:24:58.100 に答える
0

次のようにエスケープできます。

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> ${fn:escapeXml(myString)}

于 2012-10-05T19:41:29.380 に答える