Php 用逗号或新行分析表单textarea

Php 用逗号或新行分析表单textarea,php,Php,我在表单中有一个文本区域,允许用户输入由换行符或逗号分隔的数字列表。我需要将他们输入的数字输入到数组中。不幸的是,我的代码不是一直有效。如果用户输入逗号分隔的数据和换行符,则逗号将保留在结果数组中。此外,如果他们在textfield的末尾添加一个换行符,那么它会在数组中输入一个空值。我的代码如下: $data = preg_split( "[\r\n]", $_POST[ 'textarea' ] ); if (count($data) == 1) { $string = $data[0

我在表单中有一个文本区域,允许用户输入由换行符或逗号分隔的数字列表。我需要将他们输入的数字输入到数组中。不幸的是,我的代码不是一直有效。如果用户输入逗号分隔的数据和换行符,则逗号将保留在结果数组中。此外,如果他们在textfield的末尾添加一个换行符,那么它会在数组中输入一个空值。我的代码如下:

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

我希望能得到一些帮助来解决我遇到的问题。

一个可能的原因可能是您缺少分隔符,
+
无法找到更多的分隔符,而不是:

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

您应该从空白处“修剪”用户输入:

$data = preg_split("[\r\n"], trim($_POST["textarea"]));
这将删除前导和尾随空格。通过将逗号指定为要修剪的第二个参数,还可以删除前导和尾随逗号,以防止使用csv时出现空数组索引:

trim($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"
}
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"
}

如果要将多个空间剥离为单个空间,请在前后修剪空间,并允许使用分号“;”而不仅仅是逗号“,”,然后这段代码对我有效。我相信这可以在一个单独的preg_分割和/或preg_替换完成

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

我已经尝试了您的代码,但不幸的是,如果同时存在逗号和换行符,则无法正确分割表单数据。例如,如果用户输入:3,(此处换行)4,(此处换行)4,(此处换行)6,则它无法处理它。如果可能的话,我想对服务器端进行分类。我想说的是,它分开了两次。太好了-谢谢!我会查一下你加入的preg_split的额外部分,以便我完全理解你所做的。多么好的解决方案,prost mein Freund!我还要向正则表达式中添加空格(\s),以便删除数字前后的空格。它看起来像
[\r\n\s]
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"
}
$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"
}
$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"
}
*/