Получение целого слова (ссылки) из фразы, когда я знаю некоторые из них - PullRequest
1 голос
/ 22 мая 2011

Допустим, у меня есть строка: Go to this page: <a href="http://mysite.com/?page=1" rel="nofollow">http://mysite.com/?page=1</a>, а у меня есть строка page.Я хотел бы создать такую ​​функцию:

MyBoolean := IsLink('Go to this page: http://mysite.com/?page=1','page',sLink); 
// sLink is a Var, so it would return http://mysite.com/?page=1

По сути, она должна проверять, является ли слово "страница" частью ссылки.

Однако я просто могу 'не могу понять это.Любые советы?

Ответы [ 3 ]

4 голосов
/ 22 мая 2011

Вы можете сделать что-то вроде

function GetLinkContaining(const Str, SubStr: string; out URL: string): boolean;
const
  ValidURLSpecialChars = ['.', ':', '/', '?', '=', '&', '%'];
  Prefixes: array[0..4] of string = ('http://', 'https://', 'ftp://', 'mailto:',
    'www.');

  function IsValidURLChar(const Char: char): boolean;
  begin
    result := IsLetterOrDigit(Char) or (Char in ValidURLSpecialChars);
  end;

var
  SubStrPos: integer;
  Start, &End: integer;
  i: Integer;
  URLBegin: integer;
begin
  result := false;

  URLBegin := 0;
  for i := low(Prefixes) to High(Prefixes) do
  begin
    URLBegin := Pos(Prefixes[i], Str);
    if URLBegin > 0 then
      break;
  end;
  if URLBegin = 0 then Exit(false);

  SubStrPos := PosEx(SubStr, Str, URLBegin);
  if SubStrPos = 0 then Exit(false);

  Start := SubStrPos;
  for i := SubStrPos - 1 downto 1 do
    if IsValidURLChar(Str[i]) then
      dec(Start)
    else
      break;
  &End := SubStrPos + length(SubStr);
  for i := SubStrPos + length(SubStr) to length(Str) do
    if IsValidURLChar(Str[i]) then
      inc(&End)
    else
      break;
  URL := Copy(Str, Start, &End - Start);
  result := true;
end;

Чтобы проверить это:

procedure TForm1.FormCreate(Sender: TObject);
var
  s: string;
begin
  if GetLinkContaining('Go to this page: http://mysite.com/?page=1 (right now!)',
    'page', s) then
    ShowMessage(s);
  if GetLinkContaining('This is my favourite site (www.bbc.co.uk).', 'bbc', s) then
    ShowMessage(s);        
end;
3 голосов
/ 22 мая 2011

Чтобы проверить, является ли 'page' частью строки, вы можете использовать функцию Pos.

функция Pos (Str, Источник: строка): целое число;

Pos возвращает целое число, указывающее позицию первого вхождения одной строки в другой.

Pos ищет первое полное вхождение Str в Source. Если он находит его, он возвращает позицию символа в Source первого символа в Str как целочисленное значение, в противном случае он возвращает 0. Pos чувствителен к регистру. Так что, возможно, вам приходится иметь дело с ситуациями верхнего и нижнего регистра.

Чтобы извлечь URL (возможно) не так просто, вам нужно определить больше условий. Если URL всегда находится в конце вашей строки, вы можете скопировать все с http (также используйте Pos и ​​Copy!)

2 голосов
/ 22 мая 2011

Среди более мощных алгоритмов сопоставления строк есть регулярные выражения . Они допускают очень сложные совпадения без написания большого количества кода, хотя для их освоения может потребоваться немного времени. В последних версиях Delphi уже есть библиотеки регулярных выражений, но вы можете найти их и для более ранних версий.

...