当我知道其中一些时,从一个短语中获取整个单词(链接)

时间:2011-05-21 20:47:35

标签: string delphi substring text-parsing

假设我有一个字符串:Go to this page: http://mysite.com/?page=1,我有一个字符串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

基本上应该检查单词“page”是否是链接的一部分。

但是我无法弄明白。有什么提示吗?

3 个答案:

答案 0 :(得分:4)

您可以执行类似

的操作
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;

答案 1 :(得分:3)

要检查'page'是否是字符串的一部分,您可以使用函数Pos。

function Pos(Str,Source:string):integer;

Pos返回一个整数,指定一个字符串在另一个字符串中第一次出现的位置。

Pos寻找源头中Str的第一次完整出现。如果找到一个,则返回Str中第一个字符的Source中的字符位置作为整数值,否则返回0.Pos区分大小写。所以mybe你必须处理上下情况。

要提取URL(可能)不那么容易,您必须定义更多条件。如果URL始终位于字符串的末尾,则可以复制http中的所有内容(也可以使用Pos和Copy!)

答案 2 :(得分:2)

在功能更强大的字符串匹配算法中,有regular expressions。它们允许非常复杂的匹配,而无需编写太多代码,尽管掌握它们可能需要一点时间。最新版本的Delphi已经有了正则表达式库,但你也可以找到一些早期版本的库。