2016-01-16 2 views
-1

Я застрял!Как я могу убедиться, что код имеет все возможности?

Код ищет слова или предложения с preg_match_all, а затем заменяет слова и преобразует единицы измерения.

Длинный текст становится $Lines[] через explode("\n", $Long_Text);

А для контура проходит через $ 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 оварищу 1a, 1b, 1c, 2a, 2b, 3c, 4а: Под Hela perioden Latt до måttlig isbildning Mellan 1500ft оч FL090. Område 3a, 3b: I början av perioden lätt до måttlig isbildning mellan FL060 och FL090.I mitten och mot slutet av perioden lätt до måttlig isbildning mellan 1500ft och FL090. Område 4b: Mot slutet av perioden lätt до måttlig isbildning mellan FL060 och FL090.

Sikt/Погода внутри/Moln оварищу 2a: Под HeLa perioden sikt OVER 8 км, lokalt 3000-5000m я snöfall. Molnbas över 2000 футов, lokalt 1500-2000 футов. Molnöversida FL125. Område 1b: I början av perioden sikt över 8km, lokalt under 1500m i dis. Molnbas över 2000 футов, lokalt 500-1000 футов. Molnöversida> FL125. I mitten och mot slutet av perioden sikt över 8km, lokalt 1500-3000m i snöfall. Molnbas över 2000 футов, lokalt 1000-1500 футов. Molnöversida FL125. Område 4b, 4c: Под гелой период sikt över 8km. Молнбас - 2000 футов. Molnöversida: Ingen prognos. Område 3a, 3b: Под гелой период sikt över 8km. Молнбас - 2000 футов. Molnöversida> FL125. Område 1c, 2b, 3c, 4a: I början och mitten av perioden sikt över 8km, lokalt under 1500m i dis. Molnbas över 2000 футов, lokalt 500-1000 футов. Molnöversida> FL125. Mot slutet av perioden sikt över 8km, lokalt 3000-5000m i snöfall. Molnbas över 2000 футов, lokalt 1500-2000 футов. Molnöversida> FL125. Område 1a: Под гелой период sikt över 8km, lokalt 1500-3000m i snöfall. Molnbas över 2000 футов, lokalt 1000-1500 футов. 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.

+0

Для вашего второго вопроса: '\ b (? (\ d +) - (\ d +) (?: ft | m | km))', см. [Demo here on regex101] (https: // regex101. com/r/kF4wM4/1) – Jan

+0

Спасибо! Это отлично работает. – Andreas

ответ

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 его, чтобы увидеть, если «значение» exsists. Я делаю подсчет массива и запускаю forloop по количеству раз найденных значений preg_match.

Он выполняет эту работу, но это уродливо.

Смежные вопросы