0

基本上,我有一个通过 foreach 循环从多维数组构建的变量。

我需要以某种方式验证它的格式,尽管我不确定如何去做,因为在 PHP 方面我还是个新手。

这就是我的字符串的外观:

question1,answer1,answer2,answer3,answer4
question2,answer1,answer2,answer3,answer4
question3,answer1,answer2,answer3,answer4

我需要验证确切的格式,即:

string[comma]string[comma]string[comma]string[comma]string
string[comma]string[comma]string[comma]string[comma]string
string[comma]string[comma]string[comma]string[comma]string

如果可能,我需要使用布尔变量对其进行验证,如果它与格式匹配则返回 true 或 false。这些字符串可以包含任何内容,例如字母、数字、特殊字符等。

每行总是有 5 个字符串和 4 个逗号,不会多也不会少。

如果需要,这是构建多维数组然后将其转换为字符串的代码。它正在抓取上传的 CSV 文件,将其转换为多维数组,然后构建字符串。如您所见,我的数组从 1 而不是 0 开始,没有必要解释为什么,因为那是题外话。

$csv_array = array(array());
    if (!empty($_FILES['upload_csv']['tmp_name'])) 
    {
        $file = fopen($_FILES['upload_csv']['tmp_name'], 'r');
    }

    if($file)
    {
        while (($line = fgetcsv($file)) !== FALSE) 
        {
            $csv_array[] = array_combine(range(1, count($line)), array_values($line));
        }

        fclose($file);
    }


    if(!empty($csv_array[1])) 
    {   
        foreach (array_slice($csv_array,1) as $row) 
        {
            $all_questions = $all_questions . $row[1] . ",";
            $all_questions = $all_questions . $row[2] . ",";
            $all_questions = $all_questions . $row[3] . ",";
            $all_questions = $all_questions . $row[4] . ",";
            $all_questions = $all_questions . $row[5];
            $all_questions = $all_questions . "\n";
        }
    }

非常感谢所有帮助。

提前致谢!

4

5 回答 5

1

听起来正则表达式可以完成这项工作:

$match_ok = preg_match('/^([^,]+,){4}[^,]+$/', $test_string);

如果要允许[string]为空,可以将 all 更改+*.

说明:第一个^匹配行开头,然后是一个或多个不是逗号的字符,后面是逗号。该序列必须存在 4 次,并且必须跟在另一个不以逗号结尾的字符串之后。匹配行$尾。

如果要匹配 while 多行字符串,可以使用:

$match_ok = preg_match('/^(([^,]+,){4}[^,]+\n){3}$/', $test_string);

(因为preg_match默认情况下在多行模式下工作)

编辑 2:您甚至可以通过单独处理最后一行来使正则表达式与不以换行符结尾的字符串匹配,就像使用 cols 一样:

$match_ok = preg_match('/^(([^,]+,){4}[^,]+\n){2}([^,]+,){4}[^,]+$/', $test_string);
于 2013-08-23T13:07:19.970 回答
0

您可以在创建字符串变量时执行此操作,

$count=1;
$trace=array();
if(!empty($csv_array[1])) 
{   
    foreach (array_slice($csv_array,1) as $row) 
    {
        $all_questions = $all_questions . $row[1] . ",";
        $all_questions = $all_questions . $row[2] . ",";
        $all_questions = $all_questions . $row[3] . ",";
        $all_questions = $all_questions . $row[4] . ",";
        $all_questions = $all_questions . $row[5];
        $all_questions = $all_questions . "\n";
        if($row[1]=="" || $row[2]=="" || $row[3]=="" || $row[4]=="" || $row[5]=="")
        { 
              $trace[]=$count;
        }
        $count++;
    }
}

而不仅仅是随时使用 $trace 数组。

于 2013-08-23T13:37:40.103 回答
0

在 foreach 中使用

implode(',',$row); for proper formatting. 
于 2013-08-23T13:06:37.290 回答
0

试试这个简单的,可能有很多其他的解决方案

 <?php
 $test_string = "question1,answer1,answer2,answer3,answer4";
 $newarray=explode(',',$test_string);
 if(count($newarray)=='5'){
    your code......;
   }
 ?>

- - - - - - - - - - 真假 - - - - - - -

<?php
  $test_string = "questionAsdAD1###,234234,answer2,answer3,answer4";
   function ToCheckMyStrung($test_string){
    $newarray=explode(',',$test_string);
    if(count($newarray)=='5'){
       return true;
    } else {
      return false;
     }
  }
   ?>
于 2013-08-23T12:55:56.193 回答
-1

正则表达式将帮助您:

$test_string = "Some,string,you,want,to,test";
if(preg_match('@^([a-zA-Z0-9]+\,)+([a-zA-Z0-9])+$@', $test_string)) {
    echo 'All ok';
}
于 2013-08-23T12:47:52.817 回答