2010-08-14 14 views
5

Mam pole tekstowe w formularzu, które umożliwia użytkownikom wprowadzanie listy numerów oddzielonych znakiem nowej linii lub przecinkiem. Potrzebuję wprowadzonych liczb do wprowadzenia do tablicy. Niestety, kod, który mam, nie działa cały czas. Jeśli użytkownicy wprowadzają dane rozdzielane przecinkami i znak nowej linii, przecinek pozostaje w wynikowej tablicy. Dodatkowo, jeśli dodadzą znak nowej linii na końcu pola tekstowego, to wprowadzi pustą wartość do tablicy. Kod, który mam, znajduje się poniżej:Przetwarzanie tekstu w tekście za pomocą przecinka lub nowej linii

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

Miałem nadzieję na jakąś pomoc w rozwiązaniu problemów, które napotykam.

Odpowiedz

11

„listę liczb oddzielonych każdej nowej linii lub przecinkiem”
Więc nie obchodzi, który to jest, czy nie jest przecinek i nowej linii? Dlaczego więc nie użyć po prostu wszystkich trzech znaków w równym stopniu jako separatorów i pozwolić "jednego lub więcej" z nich?

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

drukuje

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

Perfect - dziękuję!Sprawdzę dodatkowe części preg_split, które umieściłeś, aby w pełni zrozumieć, co zrobiłeś. –

+0

jakie ładne rozwiązanie, prost mein Freund! – Herr

+1

Dodałbym również spację (\ s) do wyrażenia regularnego, aby spacje przed i po numerze zostały usunięte. Wyglądałoby to tak: '[\ r \ n, \ s]'. – sho

0

Jedną z możliwych przyczyn może być, że brakuje separator i + znaleźć jeden rudy więcej, zamiast tego:

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

Spróbuj:

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

Należy „przyciąć” THE dane wejściowe użytkownika z białej przestrzeni:

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

Spowoduje to usunięcie wiodącej i końcowej Biała przestrzeń. Można również usunąć początkowe i końcowe przecinki - aby zapobiec indeksy pustą tablicę, gdy CSV jest używany - określając przecinka jako drugi argument do wykończenia:

trim($data, ","); 

uzyskać więcej informacji na temat wykończenia zobaczyć http://php.net/trim

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

Spowoduje to podział na nowe wiersze lub przecinki i wyeliminowanie wszelkich nowych znaków końca linii.

+0

Próbowałem Twojego kodu, ale niestety nie jest to prawidłowe dzielenie danych formularza, jeśli istnieją zarówno przecinki, jak i znaki nowej linii. Na przykład, jeśli dane wprowadzane przez użytkownika: 3 (nowalinia tutaj) 4 (nowalinia tutaj) 4 (nowalinia tutaj) wtedy nie może obsłużyć. Chciałbym uporządkować to po stronie serwera, jeśli to możliwe. –

+0

Co mam na myśli, to to, że oddziela się dwa razy. –

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

drukuje

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

ponownie, jakie fajne rozwiązanie! – Herr

0

Jeśli chcesz rozebrać także multispaces do pojedynczych pomieszczeń, wykończenia spacje przed i po, i pozwalają również na średnikiem „; " zamiast tylko przecinka "," ten kod zadziałał dla mnie. Jestem pewien, że można to zrobić w jednym preg_split i/lub 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" 
} 
*/ 
Powiązane problemy