从一个短语中获取整个单词(链接),当我知道一些短语时
可以说我有一个字符串: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
基本上它应该检查单词“页”是链接与否的一部分。
但我只是无法弄清楚。有小费吗?
你可以做类似
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;
完美!你是如何知道这个的?太棒了! – Jeff 2011-05-21 21:20:11
仅仅因为你可以使用'&End'作为标识符并不意味着这是一件好事。 – 2011-05-21 21:24:21
@大卫:不要是这样的广场! ;) – 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的最新版本已经有了正则表达式库,但您也可以在早期版本中找到一些。
字符串是否总是包含“页面”的第一个出现?换句话说:字符串的格式总是_Go去这个页面:link_? – NGLN 2011-05-21 21:08:16
@NGLN - 不,并不总是,它可以是任何短语 – Jeff 2011-05-21 21:16:32