2013-07-25 35 views
0

我想了解使用JavaScript split()方法通過換行符(\ n)regexp進行匹配的不同瀏覽器的行爲。javascript split()僅在Firefox/IE中向陣列添加額外項目

我有一個textarea的輸入形式是採取從Excel粘貼行和由換行劃分它們到一個數組:

var rowsplit = document.getElementById("inputfield").value.split(/\n/g); 

用戶通過邊欄等等選擇在Excel中的行前11列有數據,並且在後面切片出來的電子表格邊緣有一大堆空列。因此,Excel的典型輸入爲:

[data][data][data][data]x11[null][null][null]etc until edge of spreadsheet 

區別在於什麼是由正則表達式匹配並推入數組。

在Chrome 28和Safari 5.1中,當選擇三行信息時,它將\ n正確地匹配爲3,將它們輸出到數組並在世界中無需關心地通過菊花場嬉笑。

雖然在IE10和Firefox 19中,它匹配前三個換行符,然後再拉一個空白的。所以\ n表達式將其分解成四個項目,撞上建築物並殺死數百人。

我已經閱讀了很多關於不同的瀏覽器處理CRLF字符的不同,並試圖通過\ r \ n進行分割,只是\ r,但它似乎會引入更多的麻煩。我還將Excel行復制到Notepad ++中,並打開CRLF字符的可見性,以查看僅顯示3的情況,爲什麼IE和Firefox添加另一個?

我也讀過很多關於人們用正則表達式,JS,瀏覽器,換行符和Excel的痛苦,但其中大部分似乎與舊瀏覽器更相關,所以我希望有人知道當前狀態的東西可以提供一些見解。

謝謝!

回答

1

推測,IE10和Firefix 19將該值視爲具有額外的尾隨換行符。 .split()不會因爲它在最後而忽略它。

你應該能夠.trim().split()之前「將其刪除荷蘭國際集團:

var rowsplit = document.getElementById("inputfield").value.trim().split(/\n/g); 

另一種選擇是使用zero-width look-ahead只匹配\n有後他們什麼:

var rowsplit = document.getElementById("inputfield").value.split(/\n(?=\s*\S)/g); 

例每個:http://jsfiddle.net/FChES/

+0

嗯,瀏覽器不應該假設... trim()方法完美工作,非常感謝。因爲我有幾個用戶在IE8上AFAIK不支持trim(),所以我可能會稍後再看第二個選項。 – walkah

+0

@walkah是的,這是一個[ES5方法](http://es5.github.io/#x15.5.4.20),而IE8基於ES3。但是,MDN爲舊版瀏覽器提供了[polyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Compatibility)。 –