HTML変換をしたいのですが、URLに自動でリンクタグを付けるにはどうしたら良いでしょうか?
こんな感じですか
const
LinkTag1 = '<a href="';
LinkTag2 = '" target="_blank">';
LinkTag3 = '</a>';
function SetLinkTag(URL,Title:string):string;
begin
result := LinkTag1+URL+LinkTag2+Title+LinkTag3;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := SetLinkTag('http://www.google.co.jp','Google');
end;
すみません、説明不足です
それくらいならできるのですが、
StringかTStrings内の全てにしたいのですがどうすればよいでしょう
(掲示板の書き込みのように)
RFC2396に書かれているとおりに解析すればよろしいのでは?
ただ、それだと問題が出る場合もあります。
簡単なのは、http:などのプロトコル名を探し、その次の文字から、「URLで使用できる文字」でない文字が現れるまでをURLとし、抜き出せばOKです。
URLで使用できる文字として、例えば[0-9][a-z][A-Z]|/|#|\?|%|:としておけば、ほぼURLとして認識できます。
ありがとうございます
ansipos等を使って試してみます
明日から中学のスキー合宿なので結果は少し遅れます
AからZまで全て表示する方法って有りますか?
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
begin
SetLength(s,26);
for i := 1 to 26 do s[i] := Char(i+$40);
Label1.Caption := s;
end;
Zaurus = Class(TPDA)で書いたので、
実パラメータの順番、位置を示す数字が適当ですが
全体の流れはこんなものですか?
function henkan(s:string):string;
var
moji:array[0..60] of char =
('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','.','/',':','?','&','=','#','\','-','_');
hoge,hoge2:string;
i:integer;
begin
i:=ansipos('http://',s);
while i>0 do
begin
hoge:=hoge+leftstr(s,i-1);
s:=rightstr(s,length(s)-i+2);
i:=0;
while (s[i] in moji)and(length(s)>0) do
begin
hoge2:=hoge2+s[i];
i:=i+1;
end;
s:=stringreplace(s,hoge2,'',[])
hoge:=hoge+'<A Href='+hoge2+'>'+hoge2+'</A>';
hoge2:='';
i:=ansipos('http://',s);
end;
hoge:=hoge+s;
result:=hoge;
end;
jokさんなら何がしたいかは分かってくれると思います
こんな感じではどうでしょう。
再帰処理はあまりデバッグしていないので、深い場合は問題あるかもしれません。
function henkan(const s: String): String;
var
p1, p2: PCHAR;
i1, i2: integer;
begin
i1 := AnsiPos('http:', s);
if i1 = 0 then
begin
Result := s;
Exit;
end;
p1 := PCHAR(s);
p2 := p1+i1;
while p2^ <> #0 do
begin
case p2^ of
'a'..'z','A'..'Z','0'..'9','/','.',':','?','&','=','#','\','-','_': Inc(p2);
else
Break;
end;
end;
i2 := p2 - p1 + 1;
Result := Copy(s, 1, i1-1) + '<A HREF="'+Copy(s,i1, i2 - i1) + '">' + Copy(s,i1, i2 - i1) + '</A>' +
henkan(Copy(s, i2, Length(s)));
end;
とりあえず解決です
> とりあえず解決です
はぁぁ、報告だけですか。
ソースを書いてもお礼はなし、ですね。
そうですか。
function henkan(s:WideString):string;
var
hoge,hoge2:string;
i:integer;
begin
i:=ansipos('http://',s);
while i>0 do
begin
hoge:=hoge+Thebsys.CSLeft(s,'http://');
s:=Thebsys.CSRight(s,'http://');
i:=1;
Hoge2:='http://';
while (i<Length(S)) do
begin
if thebsys.ArrayFindStr(s[i],moji) then
begin
hoge2:=hoge2+s[i];
end;
i:=i+1;
end;
s:=Thebsys.CSRight(s,Hoge2);
hoge:=hoge+'<A Href='+hoge2+'>'+hoge2+'</A>';
hoge2:='';
i:=ansipos('http://',s);
end;
hoge:=hoge+s;
result:=hoge;
end;
でできました。ありがとうございました
ツイート | ![]() |