【问题标题】:Why does the JavaScript String whitespace character   not match?为什么 JavaScript 字符串空白字符不匹配?
【发布时间】:2014-02-26 09:10:12
【问题描述】:

我在 HTML 中得到了以下结构:

<div id="text">
  some&nbsp;text
</div>

如果我修剪文本并使用:

$("#text").text().trim() === "some text"

它返回false,也:

$("#text").text().trim() === "some&nbsp;text"

返回false,但是:

/^some\s{1}text$/.test($("#text").text().trim())

返回true。 所以请告诉我,这里出了什么问题。

正如你所建议的,我使用的是 jQuery (1.6)。

【问题讨论】:

  • /^some\s{1}text$/.test("some&amp;nbsp;text".trim()) 为我返回 falsejsfiddle.net/JamesD/m9TXr
  • 如以下答案中所述,您需要通过 jQuery 解析它。
  • 因为那不是“Javascript 字符串空白字符”。

标签: javascript jquery regex


【解决方案1】:

这是因为无间断空格(charCode 160)不完全等于空格(charCode 32)

jquery 的 .text() 将 HTML 实体编码为其直接的 unicode 等效项,因此 &amp;nbsp; 变为 String.fromCharCode(160)

您可以通过将所有不间断空格替换为普通空格来解决它:

d.text().replace(String.fromCharCode(160) /* no breaking space*/,
         " " /* ordinary space */) == "some text"

或者更好:

d.text().replace(/\s/g /* all kinds of spaces*/,
         " " /* ordinary space */) == "some text"

【讨论】:

  • 不是我真正想要使用的修复号而不是键常量,但它没关系并且可以完成它的工作。
  • 而不是使用特定的160,你可以使用$('#text').text().trim().replace($('&lt;b&gt;&amp;nbsp;&lt;/b&gt;').text(), " "),显然你会缓存$('&lt;b&gt;&amp;nbsp;&lt;/b&gt;').text()部分——这将支持任何不同的浏览器和jQuery决定使用@987654329 @现在和将来。也就是说,您使用 RegExp 的第二个示例要好得多.. 特别是因为它支持多个替换。
  • 那个正则表达式并不是包罗万象的。我这样做了:var htmlString = $myField.text().replace(/\s/g,""); 努力删除所有空格。相反,零宽度空格字符 8203 仍然存在并导致 htmlString.length 读为 1。您可能也需要替换这个。
【解决方案2】:

&amp;nbsp; 与空格字符(Unicode U+0020)不同。它是一个不间断的空格字符,在 Unicode 中编码为 U+00A0。这就是为什么你的第一个测试不匹配,但第三个匹配的原因; \s 匹配所有空白字符。

要么坚持你的正则表达式测试,要么在你的相等性检查中使用\u00a0\xa0

$("#text").text().trim() === "some\xa0text";
$("#text").text().trim() === "some\u00a0text";

【讨论】:

    【解决方案3】:

    它没有考虑不可见的\n

    去掉\n,用==检查。

    试试这个:

    var x = $("#text").html();
    x = x.replace(/(\r\n|\n|\r)/gm, "");
    x = x.replace(/\s+/g, '');
    alert(x);
    
    if (x == 'some&nbsp;text') {
      alert('true');
    }
    else {
      alert('false');
    }
    

    希望这会有所帮助。

    【讨论】:

    • @alpham8 :也添加了代码。你也可以缩短它。让我知道它是否有帮助或您有任何疑问。理想情况下,您可以在一个 .remove() 中同时删除空格和 \n。
    • 如果模式中没有^$,则m 模式修饰符是无用的。
    【解决方案4】:

    有几个类似的问题。你可以去看看。

    Matching jquery .text() to &nbsp; nonbreaking space

    如前文所述。您可以使用 "==" 而不是 "===" 进行比较,并使用 '\xa0' 来比较&amp;nbsp;,这是不间断空格的实际字符。

    【讨论】: