2010-08-14 12 views
5

Ich habe eine Textarea in einer Form, die Benutzer eine Liste von Zahlen getrennt durch eine neue Zeile oder ein Komma eingeben können. Ich brauche die eingegebenen Zahlen, um sie in ein Array einzugeben. Leider funktioniert der Code, den ich habe, nicht immer. Wenn Benutzer kommaseparierte Daten und einen Zeilenumbruch eingeben, wird das Komma im resultierenden Array belassen. Wenn sie am Ende des Textfelds einen Zeilenumbruch einfügen, wird ein leerer Wert in das Array eingegeben. Der Code, den ich habe, ist unten:Parse Formular Textbereich mit Komma oder neue Zeile

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

Ich hoffte auf etwas Hilfe, wie man um die Probleme kommt, die ich habe.

Antwort

11

„eine Liste von Zahlen getrennt durch entweder eine neue Zeile oder ein Komma“
Also, kümmert es dich nicht ein, was es ist, oder wenn es ein Komma ist und ein Newline? Warum nicht einfach alle drei Zeichen gleich als Trennzeichen verwenden und "ein oder mehrere" von ihnen zulassen?

<?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); 

druckt

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

Perfekt - danke!Ich werde die zusätzlichen Teile von preg_split nachschlagen, damit Sie verstehen, was Sie getan haben. –

+0

was für eine nette Lösung, prost mein Freund! – Herr

+1

Ich würde dem regulären Ausdruck auch Leerzeichen (\ s) hinzufügen, damit Leerzeichen vor und hinter der Zahl entfernt werden. Es würde wie '[\ r \ n, \ s]' aussehen. – sho

0

Einer der möglichen Gründe könnte sein, dass Sie Trennzeichen und + fehlen mehr ein oder zu finden, statt dessen:

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

Versuchen:

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

Sie sollten „trimmen“ die Benutzereingabe von Leerraum:

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

Dies wird führende und nachfolgende entfernen weißer Raum. Sie können auch entfernen Komma Vorder- und Hinter - leeren Array-Indizes zu verhindern, wenn csv verwendet wird - durch ein Komma als zweites Argument der Angabe zu trimmen:

trim($data, ","); 

Für weitere Informationen über trim sehen http://php.net/trim

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

Dies wird entweder durch Zeilenumbrüche oder Kommas getrennt und alle nachfolgenden Zeilenumbrüche werden entfernt.

+0

Ich habe Ihren Code versucht, aber es teilt die Formulardaten nicht korrekt, wenn es Kommas und Zeilenumbrüche gibt. Wenn ein Benutzer Eingaben zum Beispiel: 3, (Newline hier) 4 (Newline hier) 4 (Newline hier) Dann kann es nicht damit umgehen. Ich möchte diese Server-Seite nach Möglichkeit sortieren. –

+0

Was ich sagen soll, ist, dass es zweimal trennt. –

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

druckt

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

wieder, was für eine schöne Lösung! – Herr

0

Wenn Sie auch multispaces auf einzelne Leerzeichen entfernt werden sollen, trimmen Leerzeichen vor und nach, und lassen auch für Semikolon ‚; " anstatt nur Komma ',', dann hat dieser Code für mich funktioniert. Ich bin mir sicher, dass dies in einer einzigen preg_split und/oder preg_replace getan werden könnte!

$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" 
} 
*/ 
Verwandte Themen