【问题标题】:JavaScript Remove special characters string not workingJavaScript删除特殊字符字符串不起作用
【发布时间】:2012-09-26 16:21:45
【问题描述】:

我正在尝试删除可能出现在我的 Google Analytics 标记中的特殊字符,因为这些特殊字符似乎会在某些版本的 IE 中导致脚本错误。我有这个功能:

                function removeSplChars(inStr) {
                inStr = inStr.replace(/[^a-zA-Z0-9 ]/g, "");
                return inStr;
                }

并且有当前有效的 GA 代码:

                <script type="text/javascript">
                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>
                 _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>

但是当我将该函数放在代码中时,我仍然看到 Chrome 调试器中出现了特殊字符。例如,当我打开一个包含名为“Matt's”的产品的页面时,它会显示为 Matt's。我想要的是马茨。我们还有其他带有 & 和其他特殊字符的产品名称,所以我只想允许 A-z 和数字(大写/没有大写都可以)

任何建议将不胜感激。我查看了关于 SO 的以下帖子,但到目前为止还没有发现任何可以帮助我完成这项工作的内容:

How to handle (® ´ © ¿ ¡ ° À ) special characters in javascript?
javascript regexp remove all special characters
Remove all special characters except space from a string using JavaScript

我是 JSP 和 JavaScript 的新手,所以我确定我没有将代码放在正确的位置,或者我可能需要在页面上添加其他内容?我尝试将 removeSplChars 函数放在 () 中或添加一个 ;没有运气。不幸的是,我必须在工作中学习这一点,所以我必须专注于完成我被赋予的任务,而不是花时间真正理解语言的逻辑/语法。

【问题讨论】:

  • 向我们显示您呼叫removeSplChars的代码。
  • 你可以用三元表达式替换你的内联 c:choose 块。示例:${WCParam.source eq 'search' ? 'Search' : 'topCat'}
  • @some,这就是整个问题,我不会在任何地方调用它。我是 JavaScript 的菜鸟 :( 我会研究如何调用一个函数,看看我能找到什么。谢谢。
  • @JasperdeVries 如果输入的“topCat”值例如是“Patio & Outdoors”,会有帮助吗?我也会研究三元表达式。
  • 对不起,我打错了。 topCat 是一个变量,所以你可以使用 ${WCParam.source eq 'search' ? 'Search' : topCat}

标签: javascript jsp special-characters analytics


【解决方案1】:

问题不在于函数本身,它来自其他地方。证明:http://jsfiddle.net/wDaCw/

【讨论】:

  • 我想我只是没有正确实现它。你能告诉我我应该把函数放在我上面粘贴的脚本标签中的什么地方吗?也许它需要一起进入另一个JSP文件......
  • 我在锚标签上有另一个带有 GA 脚本的 .JSP;当我将此功能放在该页面上时,它也不会删除特殊字符。
【解决方案2】:

在评论中,我要求您向我们展示调用函数 removeSplChars 的代码,令我惊讶的是,您告诉我您没有在任何地方调用它。好吧,这回答了为什么什么都没有改变的问题。如果您不使用要更改的数据调用该函数,则不会发生任何更改。

我正在尝试了解您的问题是什么,因为它不应该是问题...然后我仔细查看了您的代码并发现了这一点:

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

您应该注意到颜色编码使单词search 与字符串的其余部分不同。这是因为您以单引号开始字符串,因此字符串将在下一个单引号结束。

我注意到您正在使用我不熟悉的 JSP。我查了一下,发现这些标签在发送到客户端之前由您的服务器解析,并替换为一些文本。

由于您遇到特殊字符(如单引号)的问题,问题很明显:您的标签输出的字符串没有转义为javascript字符串的一部分。 我认为所有可能的 Unicode 字符中唯一有问题的字符是双引号 (u+0022)、单引号 (u+0027) 和反斜杠 (u+005c),因为它们必须用反斜杠转义(例如 @ 987654326@、\'\\)

现在,您如何在 JSP 中做到这一点?我不知道,但我知道你不是第一个遇到这个问题的人。我快速搜索给了我this page,他们建议如下:

<spring:message code="${escapedString}" javaScriptEscape="true"/>

现在,正如我所说,我不熟悉 JSP,所以我只是猜测。尝试像这样替换您对&lt;c:out value="xxx"/&gt; 的所有使用:

<c:out value="${WCParam.searchTerm}" />

用这个:

<spring:message code="${WCParam.searchTerm}" javaScriptEscape="true"/>

如果这不起作用,请查看this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2016-01-23
    相关资源
    最近更新 更多