3

给定,在输入表单中,用户可以用换行符分隔一些特定的名称,我将这些名称保存在一个数组中。然后我打印这些名字,最后说“谢谢你的名字”。

         $var = "name1 



name2


        ";
    $your_array = explode("\n", $var);


        for($i=0; $i<(sizeof($your_array));$i++) {
          echo ($your_array[$i]);  
        }
echo "Thank you for the names"

但问题是,如果有人在一个名字之前或之后输入多个换行符,那么下一个名字会在一段距离后显示,如下所示

    name1



    name2


Thank you for the names

如何逃避这个并输出如下

name1
name2
Thank you for the names

我尝试使用 array_filter() 但它在这里不起作用。

更新:

If someone input
$var = "name1\nname2\n\n\n


           name3                     


name4";

输出应该像

name1
name2
               name3
name4

但是所有的答案都像

name1
name2
name3
name4
4

5 回答 5

2

为简单起见,让我们使用 foreach 循环......

1)我们需要遍历新数组和trim名称,所以我们会丢失所有空格。

2) 当且仅当名称的长度为 1 或更多时,我们才回显名称。

3)我们添加一个<br>标签,使每个名字出现在一个新的行上。

<?php

$var = "name1\nname2\n\n\n";

$your_array = explode("\n", $var);

foreach($your_array as $name)
{
    if(preg_match("/[a-zA-Z0-9]{1,}/i", $name)) {
        $name = trim($name);
        echo (strlen($name) > 1) ? sprintf('%s<br>', $name) : '';
    }
}

echo "Thank you for the names";
?>
于 2012-12-26T18:04:54.123 回答
1
$your_array = explode(PHP_EOL, $var);

$names = array();

for ($i = 0; $i < count($your_array); $i ++ )
{
    // trim clean spaces and newlines surrounding each line
    // resulting value is assigned to $test
    // if this value is not empty the conditional is a true proposition
    // so is assigned to $names
    if ($test    = trim($your_array[$i]))
        $names[] = $test;
}

echo implode(PHP_EOL, $names) . PHP_EOL;
echo 'Thank you for the names.';

编辑:使用foreach

$your_array = explode(PHP_EOL, $var);

foreach ($your_array as $name)
{
    if ($test    = trim($name))
        $names[] = $test;
}

if ($names)
{
    // echo implode(PHP_EOL, $names) . PHP_EOL;
    echo implode('<br />', $names) . '<br />';
    echo 'Thank you for the names.';
}
else
    echo 'Names missing.';

编辑 2

trim接受一个 charlist 来显式删除,所以如果你想保持空格,用newlinesand carriage returnonly 创建一个列表。

trim($name, "\r\n");

注意:PHP_EOL 是正确的换行符,具体取决于服务器(unix 或 windows)。

于 2012-12-26T18:04:10.167 回答
1

成为更好的 PHP 开发人员并使用原生 PHP 数组函数:

$raw_arr = array('    trim  ', 'fine', '    ');

array_walk($raw_arr, function(&$value) {
  $value = trim($value);
});

$reduced_arr = array_filter($raw_arr);

print_r($reduced_arr);

注意:我使用了闭包。如果您正在运行 PHP < 5.3,则需要将其移动到 UDF。

更新

似乎您不希望修剪用户输入。因此,您可以放下array_walk并关闭它。

$raw_arr = array('    trim  ', 'fine', '');
$reduced_arr = array_filter($raw_arr);

print_r($reduced_arr);
于 2012-12-26T18:19:46.717 回答
0
for($i=0; $i<(sizeof($your_array));$i++) {
    if (empty($your_array[$i])) continue;
          echo ($your_array[$i]);  
        }
echo "Thank you for the names"
于 2012-12-26T18:06:08.680 回答
0

您可以使用array_filter++array_map丢弃trim空白空间

$var = "name1 



name2


        ";

$array = array_filter(array_map("trim",explode("\n", $var)));
echo implode(PHP_EOL, $array) , PHP_EOL;
echo "Thank you for the names";

或者只是使用 preg_match_all

preg_match_all("/\S?([a-z0-9]+)\S?/", $var,$array);
echo implode(PHP_EOL, $array[0]),PHP_EOL;
echo "Thank you for the names";

两者都会输出

name1
name2
Thank you for the names
于 2012-12-26T19:58:20.927 回答