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
Вам все еще нужно изменить это, чтобы соответствовать только столбцу "Оценка".