2010-08-14 1 views
5

사용자가 개행 문자 나 쉼표로 구분 된 숫자 목록을 입력 할 수있는 형식의 텍스트 영역이 있습니다. 배열에 입력하기 위해 입력 한 숫자가 필요합니다. 불행히도, 내가 가진 코드는 항상 작동하지 않습니다. 사용자가 쉼표로 구분 된 데이터와 개행을 입력하면 결과 배열에 쉼표가 남습니다. 또한 텍스트 필드의 끝에 개행 문자를 추가하면 배열에 빈 값이 입력됩니다. 내가 가지고있는 코드는 다음과 같습니다.쉼표 또는 새 줄을 사용하여 양식 텍스트 영역을 파싱하십시오.

$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의 추가 부분을 살펴보고 내가 한 일을 완전히 이해할 수 있도록하겠습니다. –

+0

좋은 해결책, 프로틴 마이 인 Freund! – Herr

+1

정규식에 공백 (\ s)을 추가하여 번호 앞뒤의 공백을 제거합니다. '[\ r \ n, \ s]'와 같이 보일 것입니다. – sho

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 (여기 개행) 이어서 그것을 처리 할 수있다. 가능한 경우 서버 쪽을 정렬하고 싶습니다. –

+0

내가 말하고자하는 것은 그것이 두 번 분리된다는 것입니다. –

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

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" 
} 
*/ 
관련 문제