空字符串的问题。空()无效

时间:2016-06-30 20:59:32

标签: php laravel

我正在构建一个可以创建Word文档的表单。用户将创建列表的部分,并使用"来分隔列表行。 | " (垂直条)作为分隔符。我试图爆炸()这样的字符串:"第一行|第二行|第三行和最后一行|" 。正如你们看到的那样,我在最后一行之后放置了一个垂直条分隔符,这导致用户可能会犯这个错误,并且它会在列表中生成一个空行。 我试图通过使用类似的东西来避免这个错误:

$lines = explode("|",$lines);
for($a=0;$a<count($lines);$a++)
{
  if(!empty($lines[$a]) or !ctype_space($lines[$a])) 
  {
    //generate the line inside de Word Doc
  }
}

当我在测试代码时自己创建字符串时,此代码有效,但当字符串来自Form时,它不会起作用。并继续在Word Doc中生成一个空行列表。 当我 var_dump() $ lines 数组时,它会将最后一个键显示为: [2] =&gt; string(0)&#34;&#34;

我使用的是Laravel,表单是使用Form :: facade创建的。(不知道这件事,不是吗)

如果你们可以帮助我,我会感到骄傲。

2 个答案:

答案 0 :(得分:1)

或者只是使用array_filter和trim的回调来删除在迭代之前为空的元素或包含空格。

<?php
$string = '|foo|bar|baz|bat|';
$split  = explode('|', $string);
$split  = array_filter($split, 'trim');
var_export($split);

输出:

array (
  1 => 'foo',
  2 => 'bar',
  3 => 'baz',
  4 => 'bat',
)

但是你可能不想删除一些空值!

你可以开始修剪你的管道:

<?php
$string = '|foo|bar|baz|bat|';
$string = trim($string, '|');
$split  = explode('|', $string);
var_export($split);

输出如上。

或使用rtrim

答案 1 :(得分:0)

您可能希望使用PHP的&&(和)而不是or 有关参考,请参阅Logical Operators

如果 empty()ctype_space()都返回false,则只想输出该行。使用当前代码,空字符串将通过if测试,因为ctype_space()返回false,即使empty()没有。完全由空格组成的字符串也会通过,因为empty()返回false,即使ctype_space()没有。

纠正逻辑:

if(!empty($lines[$a]) && !ctype_space($lines[$a])) { ... }

或者,我建议在检查empty()之前修剪字符串中的空格:

$lines = explode("|",$lines);

if (!empty($lines)) {
  foreach ($lines as $line) {
    if (!empty(trim($line)) {
      // output this line
    }
  }
}

另请参阅'AND' vs '&&' as operator