2014-02-26 139 views
11

我在HTML得到了下面的结构:为什么JavaScript字符串空白字符 不匹配?

<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)。

+0

'/^some\s{1}text$/.test("some  文本“.trim())'返回'false'给我。 http://jsfiddle.net/JamesD/m9TXr/ –

+0

如下面的答案中所述,您需要通过jQuery解析它。 – alpham8

+0

因为那不是“Javascript字符串空白字符”。 –

回答

20

这是因为没有打破空间(则charCode 160)并不完全等于空间(则charCode 32)

jQuery的.text()编码HTML实体的直接的Unicode等价,所以&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" 
+0

不是我想要使用固定数字而不是关键常量,但它可以并且完成它的工作。 – alpham8

+0

您可以使用'$('#text')。text()。trim()。replace($''' ').text(),“”)显然你会缓存'$('').text()'部分 - 这将支持任何不同的浏览器和jQuery现在和未来决定使用' '。这就是说,使用RegExp的第二个例子要好得多,特别是它支持多个替换。 – Pebbl

+0

这个正则表达式并不全是包含的。我这样做:'var htmlString = $ myField.text()。replace(/ \ s/g,“”);'努力删除所有空格。相反,零宽度空格字符8203仍然存在,导致'htmlString.length'读为1.您可能还需要替换这个。 – vapcguy

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

希望这有助于。

+0

@ alpham8:也添加了一个代码。你也可以缩短它。让我知道它是否有帮助,或者如果您有任何疑问。 理想情况下,您可以在一个.remove()中删除空格和\ n。 –

12

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

要么坚持自己的正则表达式测试,或在你的平等检查,请使用\u00a0\xa0

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