PHP получает результаты из файла

У меня есть htm-файл, который содержит результаты игры. Мне нужно найти каждую оценку выше 65, вставить эти оценки и имена только в БД, а затем распечатать весь файл на странице с линиями рекордов красным цветом. Файл htm содержит простой текст:

<pre>
Thursday Afternoon Pairs Thursday Aft Session February 1, 2018

Scores after  5 rounds  Average:   50.0      Section  A  North-South

Pair    Pct   Score      Section Rank      MPs     

                         A     B     C  

  5   65.00   65.00  A   1                0.50(A)  Joseph - Marlene

  1   47.00   47.00  B  2/3    1          0.30(A)  Janet - Mina

  3   47.00   47.00  A  2/3               0.30(A)  Renee - Reichle
</pre>

В файле нет других тегов, и файл не может быть изменен.

Я только дошел до того, что пытался найти рекорды и посмотреть, смогу ли я получить их для печати. Это возвращает не найдено совпадений каждый раз.

$file = 108911.htm;
$pct = "([1-9][0-9]\.[0-9]{2})";
$highgame_pct = 65; 

$contents = file_get_contents($file);

$pattern = preg_quote($pct, '/');

$pattern = "/^.*$pct.*\$/m";

if(preg_match_all($pattern, $contents, $matches) >= $highgame_pct){
   echo "Found matches:<br />";
   echo implode("<br />\n", $matches[0]);
}
else{
   echo "No matches found";
}

2 ответа

Как и все, есть много способов сделать это, вот один из них попробовать:

# Set the threshold
$max    =   65;
# This will fetch file to array, trim spaces, then remove empty
# using file() will take the file and automatically turn it to an array
$arr    =   array_filter(file('108911.htm',FILE_SKIP_EMPTY_LINES),function($v){
    return (!empty(trim($v)));
});
# This will iterate and find matched values based on pattern
$file   =   array_values(array_filter(array_map(function($v) use ($max){
    # Find values that match decimal pattern (allows 1 to 3 whole numbers and up to 2 decimal points)
    preg_match_all('/[0-9]{1,3}\.[0-9]{1,2}/',$v,$match);
    # Checks if there are at least 3 values in matched array
    $match  =   (!empty($match[0]) && count($match[0]) == 3)? $match[0] : false;
    # If not, just return empty
    if(empty($match))
        return false;
    # If the second value (Points) is less than the max, return empty
    if($match[1] < $max)
        return false;
    # Get the name value
    preg_match('/[\w]+ - [\w]+/',$v,$name);
    # Return the points and the name
    return [
        'points' => $match[1],
        'name'  => $name[0]
    ];

},$arr)));
# Here is the raw array. You can loop this now to get the rows to insert
print_r($file);

Дает тебе:

Array
(
    [0] => Array
        (
            [points] => 65.00
            [name] => Joseph - Marlene
        )

)

preg_match_all возвращает количество полных совпадений с образцом (которое может быть нулевым) или FALSE, если произошла ошибка.

Используя подобный шаблон регулярных выражений и используя функцию обратного вызова для фильтрации массива:

# define array filter callback function
function filterArray($value1){
    return ($value1 >= 65.00);
}


# read file 
$file = "108911.htm";
$contents = file_get_contents($file);

# define regex
$pattern = "/(\d{2}\.\d{2})/m";

# find matches 
$val = preg_match_all($pattern, $contents, $matches);
echo "Count of matches = $val\n";

# filter matches array 
$filteredArray = array_filter($matches[0], 'filterArray');

# print matched element
if (count($filteredArray) > 0) {
   echo "Found matches bigger or equal to 65.00:<br />";
   echo implode("<br />\n", $filteredArray);
}
else{
   echo "No matches found";
}

Выход:

Count of matches = 10
Found matches bigger or equal to 65.00:<br />
65.00<br />
65.00

Вам все еще нужно изменить это, чтобы соответствовать только столбцу "Оценка".

Другие вопросы по тегам