假设我有一个字符串: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”是否是链接的一部分。
但是我无法弄明白。有什么提示吗?
答案 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已经有了正则表达式库,但你也可以找到一些早期版本的库。