2010-08-14 24 views
5

我在表單中有一個textarea,允許用戶輸入由換行符或逗號分隔的數字列表。我需要將他們輸入的數字輸入到數組中。不幸的是,我擁有的代碼並不是一直工作。如果用戶輸入逗號分隔的數據和換行符,則逗號將留在結果數組中。另外,如果他們在文本字段的末尾添加一個換行符,那麼它將在數組中輸入一個空值。我的代碼如下:用逗號或換行解析表單textarea

$data = preg_split("[\r\n]", $_POST[ 'textarea' ]); 
if (count($data) == 1) { 
    $string = $data[0]; 
    $data = explode(',', $string); 
} 

我一直希望得到一些關於如何解決我遇到的問題的幫助。

回答

11


「由要麼換行或逗號分隔的號碼列表」那麼,你不在乎它是哪一個,或者如果有一個逗號一個換行符?那麼爲什麼不簡單地將所有三個角色用作分隔符並允許「一個或多個」呢?

<?php 
$input = '1,2,3 
4,5,,,, 
,6, 
7 
,8,9'; 

$data = preg_split("/[\r\n,]+/", $input, -1, PREG_SPLIT_NO_EMPTY); 
var_dump($data); 

打印

array(9) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    [3]=> 
    string(1) "4" 
    [4]=> 
    string(1) "5" 
    [5]=> 
    string(1) "6" 
    [6]=> 
    string(1) "7" 
    [7]=> 
    string(1) "8" 
    [8]=> 
    string(1) "9" 
} 
+1

完美 - 謝謝!我會查找你放入的preg_split的額外部分,以便我完全理解你所做的。 – 2010-08-14 12:51:20

+0

什麼是一個不錯的解決方案,前面mein弗勞德! – Herr 2011-05-14 16:18:15

+1

我還會在正則表達式中添加空格(\ s),以便刪除數字前後的空格。它看起來像'[\ r \ n,\ s]'。 – sho 2012-10-15 16:07:36

0

其中一個可能的原因可能是因爲你缺少分隔符和+找到一個或多個,而不是這樣的:

$data = preg_split("[\r\n]", $_POST[ 'textarea' ]); 

嘗試:

$data = preg_split("/[\r\n]+/", $_POST[ 'textarea' ]); 
0

你應該「微調」用戶從空白處輸入:

$data = preg_split("[\r\n"], trim($_POST["textarea"])); 

這將刪除前導和尾隨白色空間。您還可以刪除開頭和結尾的逗號 - 防止空數組索引時CSV是使用 - 通過指定逗號作爲第二個參數修剪:

trim($data, ","); 

有關微調的詳細信息請參見http://php.net/trim

0
$data = preg_split("/[\r\n]+|,/", trim($_POST['textarea'])); 

這將通過換行符或逗號拆分,並消除任何尾隨的換行符。

+0

我試過你的代碼,但不幸的是,如果同時存在逗號和換行符,它不會正確分割表單數據。例如,如果一個用戶輸入: 3,(換行這裏) 4,(換行這裏) 4,(換行這裏) 然後,它不能處理它。如果可能的話,我想將它排除在服務器端。 – 2010-08-14 12:32:33

+0

我的意思是說它分開兩次。 – 2010-08-14 12:37:52

3
$input = '1,2,3 
4,5,,,, 
,6, 
7 
,8,9 
'; 

$data = str_replace(array("\r", "\n"), ',', $input); 
$data = array_filter(explode(',', $data)); 

var_dump(array_values($data)); 

打印

array(9) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    [3]=> 
    string(1) "4" 
    [4]=> 
    string(1) "5" 
    [5]=> 
    string(1) "6" 
    [6]=> 
    string(1) "7" 
    [7]=> 
    string(1) "8" 
    [8]=> 
    string(1) "9" 
} 
+0

再次,多好的解決方案! – Herr 2011-05-14 16:18:26

0

如果你想要去除也multispaces到單個空格,前後修整的空間,並且還允許分號「; 「而不是隻是逗號',',那麼這段代碼爲我工作。我相信這可以在單個preg_split和/或preg_replace中完成!

$string = ' 1,2,3 
    4,5,;,, 
    ;6, 
7 
, 8 ,9; 10 ; 11;'; 

$tmp = preg_split("/[\r\n,;]+/", $string, -1, PREG_SPLIT_NO_EMPTY); 
foreach($tmp as $val) 
{ 
    $val = trim(preg_replace('!\s+!', ' ', $val)); 
    if($val != "") 
     $data[] = $val; 
} 

var_dump($data); 
/* Returns 
array(11) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    [3]=> 
    string(1) "4" 
    [4]=> 
    string(1) "5" 
    [5]=> 
    string(1) "6" 
    [6]=> 
    string(1) "7" 
    [7]=> 
    string(1) "8" 
    [8]=> 
    string(1) "9" 
    [9]=> 
    string(2) "10" 
    [10]=> 
    string(2) "11" 
} 
*/ 
相關問題