2010-08-14 6 views
5

J'ai une zone de texte dans une forme qui permet aux utilisateurs d'entrer une liste de nombres séparés par une nouvelle ligne ou une virgule. J'ai besoin que les nombres qu'ils ont entrés soient entrés dans un tableau. Malheureusement, le code que j'ai ne fonctionne pas tout le temps. Si les utilisateurs entrent des données séparées par des virgules et une nouvelle ligne, la virgule est laissée dans le tableau résultant. De plus, s'ils ajoutent une nouvelle ligne à la fin du champ de texte, ils saisissent une valeur vide dans le tableau. Le code que j'ai est ci-dessous:Parse formulaire textarea par virgule ou nouvelle ligne

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

J'espérais un peu d'aide sur la façon de contourner les problèmes que je suis rencontrais.

Répondre

11

« une liste de nombres séparés soit par un saut de ligne ou une virgule »
Donc, vous ne vous souciez pas qui il est, ou s'il y a une virgule et une nouvelle ligne? Alors pourquoi ne pas simplement utiliser tous les trois caractères comme séparateurs et permettre "un ou plusieurs" d'entre eux?

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

impressions

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

Parfait - merci!Je vais chercher les parties supplémentaires de preg_split que vous avez mises afin que je comprenne parfaitement ce que vous avez fait. –

+0

quelle belle solution, prost mein Freund! – Herr

+1

J'ajouterais également de l'espace (\ s) à l'expression régulière afin que les espaces avant et après le numéro soient supprimés. Cela ressemblerait à '[\ r \ n, \ s]'. – sho

0

L'une des raisons possibles pourrait être que vous manquez delimiter et + pour trouver un ou plusieurs, au lieu de cela:

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

Essayez:

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

Vous devriez « couper » la entrée d'un utilisateur à partir d'un espace blanc:

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

Ceci supprimera les lignes avant et arrière espace blanc. Vous pouvez également supprimer de premier plan et des virgules arrière - pour empêcher les indices de tableau vide lorsque csv est utilisé - en spécifiant une virgule comme second argument pour rogner:

trim($data, ","); 

Pour plus d'informations sur l'assiette voir http://php.net/trim

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

Ceci sera divisé soit par de nouvelles lignes ou des virgules, et éliminera toutes les nouvelles lignes de fin.

+0

J'ai essayé votre code mais, malheureusement, il ne divise pas correctement les données de formulaire s'il y a des virgules et des retours à la ligne. Par exemple, si une des entrées utilisateur: 3, (nouvelle ligne ici) 4, (nouvelle ligne ici) 4, (nouvelle ligne ici) Ensuite, il ne peut pas le manipuler. Je voudrais trier ce côté serveur si possible. –

+0

Ce que je veux dire, c'est qu'il se sépare deux fois. –

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

imprime

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

encore une fois, quelle belle solution! – Herr

0

Si vous voulez dépouilleront multispaces à des espaces simples, rogner les espaces avant et après, et permettent également de virgule « ; ' au lieu de simplement virgule ',', alors ce code a fonctionné pour moi. Je suis confiant que cela pourrait être fait dans un seul preg_split et/ou preg_replace si!

$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" 
} 
*/ 
Questions connexes