Вопрос, который стоит перед разработчиками, заключается в необходимости проверки, является ли определённое слово частью URL в текстовом сообщении. Например, имея строку "Go to this page: http://mysite.com/?page=1", необходимо определить, содержит ли данная строка слово "page" в качестве части URL. Для решения этой задачи можно создать функцию, которая будет принимать исходную строку, ключевое слово и возвращать найденный URL, если он содержит указанное слово.
Решение проблемы
Для начала, давайте рассмотрим пример функции, которая решает поставленную задачу:
function GetLinkContaining(const Str, SubStr: string; out URL: string): boolean;
var
SubStrPos, Start, End: Integer;
i: Integer;
URLBegin: Integer;
ValidURLSpecialChars: array[0..10] of char;
Prefixes: array[0..4] of string;
begin
// Инициализация массивов для проверки
SetLength(ValidURLSpecialChars, ['.', ':', '/', '?', '=', '&', '%', '~']);
SetLength(Prefixes, ['http://', 'https://', 'ftp://', 'mailto:', 'www.']);
// ... (далее следует код, выполняющий основную логику функции)
end;
Функция GetLinkContaining проверяет, содержит ли строка Str указанное подстроку SubStr в качестве части URL. Она возвращает True, если URL найден, и записывает его в переменную URL. В противном случае возвращает False. Для определения начала URL используются возможные префиксы (например, http://, https://), а также проверяется наличие специальных символов, характерных для URL.
Подтвержденный ответ
В приведённом ниже коде реализована функция, которая определяет, содержит ли строка Str указанное подстрока SubStr в качестве части URL, и возвращает найденный URL, если он есть:
type
TURLChar = function(const Char: Char): Boolean;
TPrefix = string[0..4];
const
ValidURLSpecialChars = ['.', ':', '/', '?', '='];
Prefixes: array[0..4] of string = ('http://', 'https://', 'ftp://', 'mailto:', 'www.');
ValidURLSpecialCharsSet: TSet of Char;
PrefixesSet: TSet of string;
URLChar: TURLChar = function(Char: Char): Boolean is
begin
result := Char in ['0'..'9', 'a'..'z', 'A'..'Z', ValidURLSpecialChars];
end;
var
ValidURLSpecialCharsSet: TSet of Char;
PrefixesSet: TSet of string;
URLBegin: Integer;
SubStrPos: Integer;
Start, End: Integer;
i: Integer;
function IsValidURLChar(const Char: Char): Boolean;
begin
result := Char.IsLetterOrDigit or Char in ValidURLSpecialCharsSet;
end;
function GetURLPrefix(const Str: string): string;
var
i: Integer;
begin
Result := '';
for i := Low(Prefixes) to High(Prefixes) do
if Pos(Prefixes[i], Str) > 0 then
begin
Result := Prefixes[i];
Break;
end;
end;
function GetLinkContaining(const Str, SubStr: string; out URL: string): Boolean;
begin
Result := False;
URLBegin := Pos(GetURLPrefix(Str), Str);
if URLBegin = 0 then
Exit(False);
SubStrPos := PosEx(SubStr, Str, URLBegin);
if SubStrPos = 0 then
Exit(False);
Start := SubStrPos;
while Start > 1 and URLChar(Str[Start]) do
Dec(Start);
End := SubStrPos + Length(SubStr);
while End < Length(Str) and URLChar(Str[End + 1]) do
Inc(End);
Result := True;
SetLength(Str, End - Start + 1);
Copy(Str, StrDef[Start], Result);
end;
procedure TestFunction;
var
s, link: string;
begin
if GetLinkContaining('Go to this page: http://mysite.com/?page=1', 'page', link) then
ShowMessage(link);
if GetLinkContaining('This is my favourite site (www.bbc.co.uk).', 'bbc', link) then
ShowMessage(link);
// ... (реализация функции для учета регистра и локали, а также другие проверки и оптимизации)
end;
В этом коде используется функция GetLinkContaining, которая определяет границы URL, содержащего указанный подстроки SubStr, и возвращает его. Для работы с регистром и локализацией в коде могут быть использованы дополнительные функции и процедуры, например, AnsiLowerCase для преобразования строки в нижний регистр.
Заключение
В данной статье мы рассмотрели задачу проверки текста на наличие в нём URL, содержащего определённое слово, и привели пример реализации функции, которая решает эту задачу. Для разработчиков на Pascal и Delphi, работающих с текстовой обработкой, такая функция может быть полезным инструментом.
Вопрос заключается в создании функции на языке Pascal, которая проверяет, содержит ли данная текстовая строка URL, в котором присутствует определённое слово.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.