我正在构建一个可以创建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创建的。(不知道这件事,不是吗)
如果你们可以帮助我,我会感到骄傲。
答案 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
}
}
}