我正在尝试识别字符串中的空白行。以下是我在PHP中的尝试:
<?php
$alldevs = $_POST['devs'];
$devices = explode("\n", $alldevs);
foreach($devices as $device) {
if(!empty($device)){
echo $device;
} else {
echo "end of value";
}
}
?>
当我输入以下内容时:
1
2
3
4
我得到了这个输出:
1
2
3
4
但它应该输出的是:
1
2
3
end of value
end of value
4
我做错了什么?
答案 0 :(得分:2)
它们可能包含\r
(在某些浏览器/操作系统的文本区域中的新行上发布),空格或制表符。您可以使用trim()
命令删除这些:
<?php
$alldevs = $_POST['devs'];
$devices = explode("\n", $alldevs);
foreach ($devices as $device) {
$device = trim($device); //Trim that string!
if(!empty($device))
{
echo $device;
}
else
{
echo "end of value";
}
}
?>
哦,请为您自己的代码缩进代码,为了每个人的利益。
或者,使用正则表达式分割字符串:
$devices = preg_split("/(\r\n|\n\r|\r|\n)/", $alldevs);
答案 1 :(得分:2)
这可以给你你想要的东西:
if( trim($device) !== '' )
{
echo $device."<br>";
}
else
{
echo "end of value"."<br>";
}
输出:
1
2
3
end of value
4
答案 2 :(得分:1)
我认为你的问题出在\r\n
使用此代码
$alldevs = str_replace("\r", '', $alldevs);
然后将其爆炸,并将trim
用于清洁空间
$alldevs = trim($alldevs);
答案 3 :(得分:1)
首先,请阅读dealing with line endings和wikipedia newline
第二,当你应该使用像preg_match_all
这样的函数时,你正在使用字符串爆炸代码应该看起来像这样(请注意坏的正则表达式):
<?php
$string = $_POST['devs'];
preg_match_all('%^([^\n\r]*)[\n\r]?$%im', $string, $matches);
foreach ($matches[1] as $match) {
if($match) {
var_dump($match);
} else {
echo 'empty line' . PHP_EOL;
}
}
调整此代码以满足您的需求,我在那里留下了一个var_dump,以便您可以看到字符串长度。
答案 4 :(得分:0)
添加对超过0个字符的字符串的检查,
if(!empty($device) && strlen($device)>0)
{
我还会在您的换行符上尝试使用\r\n
的用例,您也会遇到这种情况。
答案 5 :(得分:0)
你可以试试这个
$devices = preg_replace('/^\s*$/','end of value',explode("\n",$alldevs));
foreach($devices as $device) {
echo $device, "\n";
}