URLに自動でリンク

解決


るるとん@K  2004-02-03 23:27:06  No: 6944

HTML変換をしたいのですが、URLに自動でリンクタグを付けるにはどうしたら良いでしょうか?


jok  2004-02-04 02:11:22  No: 6945

こんな感じですか

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;


るるとん@K  2004-02-04 03:34:22  No: 6946

すみません、説明不足です
それくらいならできるのですが、
StringかTStrings内の全てにしたいのですがどうすればよいでしょう
(掲示板の書き込みのように)


にしの  2004-02-04 03:42:13  No: 6947

RFC2396に書かれているとおりに解析すればよろしいのでは?
ただ、それだと問題が出る場合もあります。
簡単なのは、http:などのプロトコル名を探し、その次の文字から、「URLで使用できる文字」でない文字が現れるまでをURLとし、抜き出せばOKです。
URLで使用できる文字として、例えば[0-9][a-z][A-Z]|/|#|\?|%|:としておけば、ほぼURLとして認識できます。


るるとん@K  2004-02-04 03:54:36  No: 6948

ありがとうございます
ansipos等を使って試してみます
明日から中学のスキー合宿なので結果は少し遅れます


るるとん@K  2004-02-04 04:00:00  No: 6949

AからZまで全て表示する方法って有りますか?


jok  2004-02-04 04:28:15  No: 6950

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;


るるとん@K  2004-02-04 05:40:33  No: 6951

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さんなら何がしたいかは分かってくれると思います


にしの  2004-02-04 05:57:15  No: 6952

こんな感じではどうでしょう。
再帰処理はあまりデバッグしていないので、深い場合は問題あるかもしれません。

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;


るるとん@K  2004-02-07 21:01:37  No: 6953

とりあえず解決です


つっか  2004-02-07 21:48:06  No: 6954

> とりあえず解決です

はぁぁ、報告だけですか。
ソースを書いてもお礼はなし、ですね。
そうですか。


るるとん@K  2004-02-08 04:43:21  No: 6955

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;

でできました。ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加