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

问题描述:

可以说我有一个字符串: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 

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

但我只是无法弄清楚。有小费吗?

+0

字符串是否总是包含“页面”的第一个出现?换句话说:字符串的格式总是_Go去这个页面:link_? – NGLN 2011-05-21 21:08:16

+0

@NGLN - 不,并不总是,它可以是任何短语 – Jeff 2011-05-21 21:16:32

你可以做类似

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; 

为了测试它(也可以使用POS和复制!):

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; 
+0

完美!你是如何知道这个的?太棒了! – Jeff 2011-05-21 21:20:11

+7

仅仅因为你可以使用'&End'作为标识符并不意味着这是一件好事。 – 2011-05-21 21:24:21

+0

@大卫:不要是这样的广场! ;) – 2011-05-21 21:28:02

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

函数Pos(Str,Source:string):integer;

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

Pos查找源中Str的第一个完整发生。如果它找到一个,它将Str中第一个字符的Source中的字符位置作为整数值返回,否则返回0. Pos对区分大小写。因此,你必须处理上限和下限情况。

要提取URL(可能)并不那么容易,您必须定义更多条件。如果URL总是在你的字符串的结尾,你可以从HTTP上的所有内容复制

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