
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
Отчет по лабораторной работе № 4 Вариант 7 Тема работы “Программирование на языке Java”
по дисциплине “Программирование на языках высокого уровня”
студента очного отделения
3 Курса 12002105 группы
Проверил:
Доц. Лифиренко Максим Александрович
Белгород, 2024
Задание
На вход программы подается произвольный html-файл, необходимо все ссылки http:// не находящиеся в теге обернуть тегом в качестве описания использовать имя домена до первого символа «/».
Например, ссылку https://www.bsu.edu.ru/bsu/resource /schedule/ teachers/ index.php? teacher=1500 необходимо заменить на <a href = “https://www.bsu.edu.ru/ bsu/resource/schedule/ teachers/ index.php? teacher=1500 ”>bsu.edu.ru </a>
Вывести в консоль статистику по обработанному файлу:
- указать ссылки с тегом и их количество повторений
- указать ссылки без тега обработанные и их повторения
Сохранить новый html-файл
Ход выполнения работы
В ходе выполнения работы была написана программа для работы с регулярными выражениями применительно к файлам.
Программа считывает данные из файла index.html в коллекцию List<String>. При этом используется библиотека java.nio.*. С помощью java.util.regex.* и входящих в этот модуль объектов Pattern и Matcher каждая строка сканируется и выбираются ссылки двух типов – с тегом <a> и без тега.
При нахождении ссылки актуализируется статистика по ссылкам каждого типа, которая хранится в двух коллекциях HashMap<String, Integer>.
После завершения обработки файла собранная по каждому типу ссылок статистика сохраняется в новый файл – index_processed.html, в котором не остаётся ни одной ссылки без тега <a>.
Результат работы программы представлен на рисунке 1.
Рисунок 1 – Результат работы программы
Листинг программы
Содержимое файла index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body style="padding:0 20%">
<p style="text-align: justify;">Lorem ipsum dolor <a href="http://google.com">google.com</a> sit amet, consectetur adipiscing elit. </p>
<p style="text-align: justify;"> Donec nec nulla http://google.com quis justo vestibulum lobortis tincidunt vel eros </p>
<p style="text-align: justify;"> Nunc congue urna et http://google.com tincidunt bibendum </p>
<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>
<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://google.com">google.com</a> Cras magna purus, euismod nec justo vitae, iaculis tristique libero </p>
<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>
<p style="text-align: justify;"> Sed quis dolor eu<a href="http://google.com">google.com</a> turpis feugiat iaculis </p>
<p style="text-align: justify;"> Donec pulvinar http://google.com eros quam, sit amet facilisis </p>
<p style="text-align: justify;">Lorem ipsum dolor http://yandex.ru sit amet, consectetur
adipiscing elit. </p>
<p style="text-align: justify;"> Donec nec nulla http://yandex.ru quis justo vestibulum lobortis tincidunt vel eros
</p>
<p style="text-align: justify;"> Nunc congue urna et http://yandex.ru tincidunt bibendum </p>
<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>
<p style="text-align: justify;"> Nullam id nulla ipsum. http://yandex.ru Cras magna purus,
euismod nec justo vitae, iaculis tristique libero </p>
<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>
<p style="text-align: justify;"> Sed quis dolor eu http://yandex.ru turpis feugiat iaculis </p>
<p style="text-align: justify;"> Donec pulvinar http://yandex.ru eros quam, sit amet facilisis </p>
<p style="text-align: justify;">Lorem ipsum dolor <a href="http://bing.com">bing.com</a> sit amet, consectetur
adipiscing elit. </p>
<p style="text-align: justify;"> Donec nec nulla http://bing.com quis justo vestibulum lobortis tincidunt vel eros
</p>
<p style="text-align: justify;"> Nunc congue urna et http://bing.com tincidunt bibendum </p>
<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>
<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://bing.com">bing.com</a> Cras magna purus,
euismod nec justo vitae, iaculis tristique libero </p>
<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>
<p style="text-align: justify;"> Sed quis dolor eu<a href="http://bing.com">bing.com</a> turpis feugiat iaculis </p>
<p style="text-align: justify;"> Donec pulvinar http://bing.com eros quam, sit amet facilisis </p>
</body>
</html>
Содержимое файла index_processed.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body style="padding:0 20%">
<p style="text-align: justify;">Lorem ipsum dolor <a href="http://google.com">google.com</a> sit amet, consectetur adipiscing elit. </p>
<p style="text-align: justify;"> Donec nec nulla <a href="http://google.com">google.com</a> quis justo vestibulum lobortis tincidunt vel eros </p>
<p style="text-align: justify;"> Nunc congue urna et <a href="http://google.com">google.com</a> tincidunt bibendum </p>
<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>
<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://google.com">google.com</a> Cras magna purus, euismod nec justo vitae, iaculis tristique libero </p>
<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>
<p style="text-align: justify;"> Sed quis dolor eu<a href="http://google.com">google.com</a> turpis feugiat iaculis </p>
<p style="text-align: justify;"> Donec pulvinar <a href="http://google.com">google.com</a> eros quam, sit amet facilisis </p>
<p style="text-align: justify;">Lorem ipsum dolor <a href="http://yandex.ru">yandex.ru</a> sit amet, consectetur
adipiscing elit. </p>
<p style="text-align: justify;"> Donec nec nulla <a href="http://yandex.ru">yandex.ru</a> quis justo vestibulum lobortis tincidunt vel eros
</p>
<p style="text-align: justify;"> Nunc congue urna et <a href="http://yandex.ru">yandex.ru</a> tincidunt bibendum </p>
<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>
<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://yandex.ru">yandex.ru</a> Cras magna purus,
euismod nec justo vitae, iaculis tristique libero </p>
<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>
<p style="text-align: justify;"> Sed quis dolor eu <a href="http://yandex.ru">yandex.ru</a> turpis feugiat iaculis </p>
<p style="text-align: justify;"> Donec pulvinar <a href="http://yandex.ru">yandex.ru</a> eros quam, sit amet facilisis </p>
<p style="text-align: justify;">Lorem ipsum dolor <a href="http://bing.com">bing.com</a> sit amet, consectetur
adipiscing elit. </p>
<p style="text-align: justify;"> Donec nec nulla <a href="http://bing.com">bing.com</a> quis justo vestibulum lobortis tincidunt vel eros
</p>
<p style="text-align: justify;"> Nunc congue urna et <a href="http://bing.com">bing.com</a> tincidunt bibendum </p>
<p style="text-align: justify;"> Sed malesuada pellentesque massa, quis pellentesque dolor aliquet ut </p>
<p style="text-align: justify;"> Nullam id nulla ipsum. <a href="http://bing.com">bing.com</a> Cras magna purus,
euismod nec justo vitae, iaculis tristique libero </p>
<p style="text-align: justify;"> Curabitur faucibus neque massa, quis interdum risus vestibulum nec </p>
<p style="text-align: justify;"> Sed quis dolor eu<a href="http://bing.com">bing.com</a> turpis feugiat iaculis </p>
<p style="text-align: justify;"> Donec pulvinar <a href="http://bing.com">bing.com</a> eros quam, sit amet facilisis </p>
</body>
</html>
Исходный код программы
package com.example;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.*;
public class App {
// Two regex for link with and without <a> tag
static String regexLinksWOTag = "https?://[a-zA-Z0-9_.-]*(\\s|<)";
static String regexLinkWithTag = "href=\"https?://[a-zA-Z0-9_.-]*\\\"";
public static void main(String[] args) {
System.out.println("\n\nНачало работы программы");
// Two HashMap collections for count of links with and without tag
HashMap<String, Integer> linksWOTagStatistic = new HashMap<String, Integer>();
HashMap<String, Integer> linksWithTagStatistic = new HashMap<String, Integer>();
System.out.println("Попытка открыть файл");
try {
// Get all lines from file using nio library
List<String> linesFromFile = Files.readAllLines(Paths.get("index.html"));
List<String> processedLinesToWrite = new ArrayList<String>();
System.out.println("Файл успешно открыт, строки прочитаны");
System.out.println("Начало поиска строк по шаблону");
// Go through whole collection
for (String line : linesFromFile) {
try {
// Compile pattern and create matcher object for links with tag
// This pattern doesn't modify lines, therefore it should go first
Pattern withTagPattern = Pattern.compile(regexLinkWithTag);
Matcher withTagMatcher = withTagPattern.matcher(line);
if (withTagMatcher.find()) {
// Get link text
String link = withTagMatcher.group(0).trim();
// Get link text without href and other stuff using split
String raw_link_text = link.split("\"")[1];
// Add link to hashMap
updateHashMap(linksWithTagStatistic, raw_link_text);
}
// Complile pattern and create matcher objects for links without tag
Pattern WOTagLinkPattern = Pattern.compile(regexLinksWOTag);
Matcher WOTagMatcher = WOTagLinkPattern.matcher(line);
// If something was found
if (WOTagMatcher.find()) {
// Extract link from file and remove space in the end
String link = WOTagMatcher.group(0).trim();
// Extract domain using simple split method
String domain = link.split("/")[2];
// Add tag for the link
String linkWTag = String.format("<a href=\"%s\">%s</a>", link, domain);
line = line.replaceFirst(link, linkWTag);
// Update count of such links in hashmap
updateHashMap(linksWOTagStatistic, link);
}
// Add processed line to the other collection
processedLinesToWrite.add(line);
}
// Raise exception if something is wrong with pattern
catch (PatternSyntaxException e) {
System.out.println("Произошла ошибка при попытке компилировать паттерн");
System.out.println("Текст ошибки: " + e.getMessage());
}
}
System.out.println("\nРезультаты поиска:");
// Print links without tag
System.out.println("\nСсылки без тега");
printHashMapToConsole(linksWOTagStatistic);
// Print links with tag
System.out.println("\nСсылки с тегом");
printHashMapToConsole(linksWithTagStatistic);
// Write processed lines down to a new file
Path pathToProcessedIndex = Paths.get("index_processed.html");
try{
Files.write(pathToProcessedIndex, processedLinesToWrite);
System.out.println("\nОбработанные строки были успешно записаны в новый файл index_processed.html");
}
catch (Exception e){
System.out.println("Произошла неизвестная ошибка при записи файла");
System.out.println(e.getMessage());
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("\n\n");
}
// Function to add new link with counter to hash map or just update counter if
// map already contains that link
static void updateHashMap(HashMap<String, Integer> linksCollection, String link) {
if (linksCollection.containsKey(link)) {
int count = linksCollection.get(link);
linksCollection.put(link, count + 1);
} else {
linksCollection.put(link, 1);
}
}
// Function to print whole hash map to console using formatted output
static void printHashMapToConsole(HashMap<String, Integer> object) {
int i = 0;
for (HashMap.Entry<String, Integer> entry : object.entrySet()) {
System.out.printf("%d. %s - %d шт\n", i + 1, entry.getKey(), entry.getValue());
i++;
}
}
}