2011-05-21 32 views
1

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

回答

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; 

爲了測試它(也可以使用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

3

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

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

Pos返回一個整數,指定在另一個字符串中第一次出現的位置。

Pos查找源中Str的第一個完整發生。如果它找到一個,它將Str中第一個字符的Source中的字符位置作爲整數值返回,否則返回0. Pos對區分大小寫。因此,你必須處理上限和下限情況。

要提取URL(可能)並不那麼容易,您必須定義更多條件。如果URL總是在你的字符串的結尾,你可以從HTTP上的所有內容複製

2

其中更強大的字符串匹配算法有regular expressions。它們允許非常複雜的匹配,而不需要編寫太多代碼,但掌握它們可能需要一點時間。 Delphi的最新版本已經有了正則表達式庫,但您也可以在早期版本中找到一些。

相關問題