如何确保代码运行所有可能性?

时间:2016-01-16 11:40:12

标签: php regex for-loop

我被困住了!

代码使用preg_match_all查找单词或句子,然后替换单词并转换单位。

长文字通过$Lines[]

变为explode("\n", $Long_Text);

for循环遍历$ Lines。

If(preg_match_all)查找该行是否包含其要查找的内容。

出现问题:

两个相同的preg_match_all()都是正确的,但因为代码只在每一行上看一次,所以它会跳过它。

其他问题:

3500ft处理为500英尺,因为preg_match_all("/(\d{3,4})(ft)/", $Lines[$i], $output_array)可以选择3位数。 如何强制它首先查找4位数字然后3位数字。 我唯一的选择是两个preg_matches,第一个是{4},下一个是{3}吗?

示例Long_Text:

  

Isbildning   Område1a,1b,1c,2a,2b,3c,4a:在helaperiodenlätt到måttlig   isbildning mellan 1500ft och FL090。   Område3a,3b:我börjanavperiodenlätt直到måttligisbildning   mellan FL060 och FL090.I mitten och mot slutet avperiodenlätttill   måttligisbildningmellan 1500ft och FL090。   Område4b:Mot slutet avperiodenlätt直到måttligisbildning mellan   FL060 och FL090。

     

SIKT /维德/ Moln   Område2a:在hela periodensiktöver8km,lokalt 3000-5000m i   snöfall。 Molnbasöver2000ft,lokalt 1500-2000ft。 Molnöversida   FL125。   Område1b:我börjanavperiodensiktöver8km,lokalt 1500m以下我   DIS。 Molnbasöver2000ft,lokalt 500-1000英尺。 Molnöversida> FL125。一世   mitten och mot slutet av periodensiktöver8km,lokalt 1500-3000m i   snöfall。 Molnbasöver2000ft,lokalt 1000-1500ft。 Molnöversida   FL125。   Område4b,4c:在hela periodensiktöver8km。 Molnbasöver2000ft。   Molnöversida:Ingen的预测。   Område3a,3b:在hela periodensiktöver8km。 Molnbasöver2000ft。   Molnöversida> FL125。   Område1c,2b,3c,4a:Ibörjanochmitten av periodensiktöver8km,   lokalt 1500m以下我dis。 Molnbasöver2000ft,lokalt 500-1000英尺。   Molnöversida> FL125。 Mot slutet av periodensiktöver8km,lokalt   3000-5000m我snöfall。 Molnbasöver2000ft,lokalt 1500-2000ft。   Molnöversida> FL125。   Område1a:在hela periodensiktöver8km,lokalt 1500-3000m i   snöfall。 Molnbasöver2000ft,lokalt 1000-1500ft。 Molnöversida   FL125。

for($i=0;$i<count($Lines);$i++) {
  if(preg_match_all("/(MELLAN) (\d{2}) (OCH) (\d{2}) (UTC)/", $Lines[$i], $output_array)){
    $Start = $output_array[1][0] . " " . $output_array[2][0] . " " . $output_array[3][0] . " " . $output_array[4][0] . " " . $output_array[5][0];
    $Goal =  $output_array[1][0] . " " . 1*($output_array[2][0]+$Diff) . " " . $output_array[3][0] . " " . 1*($output_array[4][0]+$Diff)  . " SVENSK TID";
    $Lines[$i] = str_replace($Start, $Goal, $Lines[$i]);
  }

  if(preg_match_all("/(\d{3,4}) (fot)/", $Lines[$i], $output_array)){
    $Start = $output_array[1][0] . " " . $output_array[2][0];
    $output_array[1][0] = ConvertMeter($output_array[1][0]);
    $Goal =  $output_array[1][0] . " meter";
    $Lines[$i] = str_replace($Start, $Goal, $Lines[$i]);
  }

  if(preg_match_all("/(\d{3,4}) (ft)/", $Lines[$i], $output_array)){
    $Start = $output_array[1][0] . " " . $output_array[2][0];
    $output_array[1][0] = ConvertMeter($output_array[1][0]);
    $Goal =  $output_array[1][0] . " meter";
    $Lines[$i] = str_replace($Start, $Goal, $Lines[$i]);
  }

  if(preg_match_all("/(\d{3,4})-(\d{3,4})(ft)/", $Lines[$i], $output_array)){
    $Start = $output_array[1][0] ."-" . $output_array[2][0] . "ft";
    $output_array[1][0] = ConvertMeter($output_array[1][0]);
    $output_array[2][0] = ConvertMeter($output_array[2][0]);
    $Goal =  $output_array[1][0] . "-" . $output_array[2][0] . " meter";
    $Lines[$i] = str_replace($Start, $Goal, $Lines[$i]);
  }

  if(preg_match_all("/(\d{3,4})(ft)/", $Lines[$i], $output_array)){
    $Start = $output_array[1][0] . $output_array[2][0];
    $output_array[1][0] = ConvertMeter($output_array[1][0]);
    $Goal =  $output_array[1][0] . " meter";
    $Lines[$i] = str_replace($Start, $Goal, $Lines[$i]);
  } 

  if(preg_match_all("/(FL)(\d{2,3})/", $Lines[$i], $output_array)){
    $Start = $output_array[1][0] . $output_array[2][0];
    $output_array[2][0] = ConvertMeter($output_array[2][0]*100);
    $Goal =  $output_array[2][0] . " meter";
    $Lines[$i] = str_replace($Start, $Goal, $Lines[$i]);
  }

  if(strpos($Lines[$i], "&gt;") !== false) $Lines[$i] = str_replace("&gt;", "över ", $Lines[$i]);
}

我真的很讨厌stackoverflow上的格式化。

1 个答案:

答案 0 :(得分:0)

我可以提出最丑陋的解决方案......

preg_match_all("/\b(\d+)(ft)/", $Lines[$i], $output_array);
                    $x = count($output_array[1]);
                    for($d=0;$d<$x;$d++){
                        if(preg_match_all("/\b(\d+)(ft)/", $Lines[$i], $output_array)){
                            $Start = $output_array[1][0] . $output_array[2][0];
                            $output_array[1][0] = ConvertMeter($output_array[1][0]);
                            $Goal =  $output_array[1][0] . " meter";
                            $Lines[$i] = preg_replace("/".$Start."/", $Goal, $Lines[$i],1);
                        } 
                    }

首先我preg_match它以查看“价值”是否存在。 我对数组进行了计数,并按照preg_match找到的值的次数启动了forloop。

它完成了这项工作,但它很难看。