すぱむ

解決


すぱむ  2010-04-30 02:46:27  No: 38370

不特定多数の絵文字を消去消して、名前だけにしたいのですが。

<img src="./emoji.gif" alt="揺れるハート" />名 前<img src="./x-emoji.gif" alt="失恋ハート" /><img src="./tuba.gif" alt="豚" />

すべての<img  〜  /> を消して、名前だけにする方法です。

絵文字はどこに現れるかわかりません。
これって正規表現コンポーネント(Delphi6)で、可能でしょうか?

もしくは、別の方法で、可能な方法を教えてください。

PosとCopyでいけると思ったんですが、面倒そうなので、正規表現と思って調べたのですが、どうもうまくいかなくって。
よろしくお願いいたします。


ささ  2010-04-30 05:00:46  No: 38371

>と<の場所だけ特定すれば、その間の文字列を抜き出せばOKだと思いますけど、
それじゃだめ?


a  2010-04-30 05:54:45  No: 38372

Posでできる。
宿題丸投げはやめた方がいい。


すぱむ  2010-04-30 15:46:27  No: 38373

まず、宿題ではないですし、たとえ宿題だとしても、何か問題でしょうか?

Posは、文字列中から指定された文字列を検索し、その位置を返す関数と記憶しているのですが。

場所の特定の仕方は、どうすれば簡単でしょうか?
不特定多数の絵文字なので、名<img src="./emoji.gif" alt="揺れるハート" />前<img src="./x-emoji.gif" alt="失恋ハート" />で<img src="./tuba.gif" alt="豚" />す

という可能性もあるので。ループか、再帰は必要だと思うのですが。

賢者の皆さん、お知恵を拝借できれば。


みい  2010-04-30 16:03:33  No: 38374

1  <  を探す。
2  その次に現れる  >  を探す。
3  その間を削除。

4  1から4までを  <  がなくなるまで続ける。


みい  2010-04-30 16:06:37  No: 38375

必要な関数
  ・Pos または AnsiPos
  ・Delete

とりあえずコード書いてみれば?


monaa  2010-04-30 18:09:25  No: 38376

ご無沙汰してます。

function DeleteTag(str:string):string;
var
  tagOn:Boolean;
  buf:string;
  i:Integer;
begin
  tagOn :=False;
  for i := 1 to Length(str) do
  begin
    if str[i]='<' then
      tagOn := True else
    if str[i]='>' then
      tagOn := False else
    begin
      if tagOn=False then
        buf := buf + str[i];
    end;
  end;
  Result := buf;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := DeleteTag(Edit1.Text);
end;

Posは使用してませんが、考え方は同じです。
HTML準拠となりますとまだまだ不備ですし、速度的にも最高ではありません。
考え方ということでわかりやすくしてあります。


KHE00221  2010-05-01 04:14:00  No: 38377

PosじゃなくてPosEx だな


たまご  2010-05-01 05:00:33  No: 38378

書いてみたら、ちゃんと動くやつが10行くらいでできましたよ。
けっこう簡単だから挑戦してみたらどうでしょうか。


スパム  2010-05-01 05:21:16  No: 38379

みなさん、ありがとうございました〜。
ところで、<>だと、”<なまえ>”の場合になまえが消されちゃいますね。^^;

だから、
<img  〜  /> を消して・・・と書いたのですが、説明不足でしたかね。
さすがに、<img名前/>という名前はいらっしゃらないと思ったもので。^^;
まぁ、どちらも例外と切っちゃってもいいんですが。

Delphi 6 Personalだと、PosExでヘルプで見つからないのですが。
とはいえ、いろいろとヒントをいただいて、参考にしてみます。


たまご  2010-05-01 06:42:35  No: 38380

だったら、

1  <img  を探す。
2  その次に現れる  />  を探す。
3  その間を削除。

4  1から3までを  <img  がなくなるまで続ける。

で十分だと思いますが。十分すぎるヒントではありませんか?


スパム  2010-05-01 07:53:02  No: 38381

repeat
  iStart := pos('<img', text);
  iEnd := pos('/>', text)-iStart+2;

    if iStart > 0 then
      Delete( text, iStart, iEnd);
  until iStart = 0;

こういうことですか?


KHE00221  2010-05-01 08:20:44  No: 38382

PosEx は  StrUtils にある


KHE00221  2010-05-01 08:42:15  No: 38383

HTML上 < と > は
< .... &lt;
> .... &gt;
となっていて

<なまえ> 

はありえない


すぱむ  2010-05-01 09:37:07  No: 38384

usesにStrUtils を追加しても、
[エラー] Unit1.pas(58): 未定義の識別子 : 'PosEx'
とでますねー。

>Delphi 6 Personalだと、PosExでヘルプで見つからないのですが。
と書いたので、私個人の環境が変なのか、ヘルプを信じると、使えないようです。

>HTML上 < と > は
実は、HTMLのソースではないんですよ。
HTMLのソースとは明記していませんし。^^;
すべての<img  〜  /> を消して、名前だけにする方法、と書いたので、その通りです。

とはいえ、書かれていないことを想像して頂くのは、大変ありがたいと思っています。
質問の直接の回答より、優れた方法がある場合もあります。

回答、ありがとうございます。


k  2010-05-01 10:13:20  No: 38385

VB荒らしまくってる例の人ですね。
無視が一番です。


すぱむ  2010-05-01 10:41:16  No: 38386

ごめん、それは別人。(苦笑

確かに、締め切ってから、書き込みをしているけど、それは補足、お礼、訂正というか、、、。
そういうのはダメなのかな?
だって、回答が付いたのに、なにかコメントしない方が無視したって事で失礼じゃない?

あ、それとも、私のことではなく、
「PosEx は  StrUtils にある」とか、書いている人の事?

だったら、違うよ。
Delphi 6 Personal(私のだけかな?)には、なかっただけで、他のバージョンではそうなんじゃないの?
古いDelphiを使っている私のも非があるし、勘違いだってあるでしょ?


KHE00221  2010-05-01 18:13:38  No: 38387

本物はアセンブラだけど
機能的にはこんな感じ

function PosEx(SubText,Text: String; Index: Integer): Integer;
begin
    Delete(Text,1,Index-1);
    Result := Pos(SubText,Text);
    if Result <> 0 then Result := Result + Index - 1;
end;

Index で開始位置を指定できる


KHE00221  2010-05-01 18:26:31  No: 38388

ところで
<img />aaa<img />bbb<img  />
とかあった場合 aaa と bbb を個々に抜き出す必要はなく
aaabbbでいいのかな?


すぱむ  2010-05-01 18:50:00  No: 38389

あ、回答ありがとう。
区切り文字ではないので、そこは問題ないです。

でも、検索の開始位置を指定できるのは、PosEx便利ですね。

そうだ、<img />を消す事だけではなく、いろいろな置換に応用できる関数を作ろうと、頭の隅で思っていたから、混乱したんだ。^^;

Posだと、置換するワードに、置換するワードが含まれていると、無限ループになるし。
text := 'abcdefg';
aをaaにするとして、Posで置換ループすると、検索位置を指定できないので、aがaaになって、aaaaになって、無限に。

だから、ポインタを使って・・・、なんて頭の隅で考えてたから、こんなあほな質問を。
あ、これはまだ必要ないし、自分で考えてもみますね。
無駄に汎用性の高い、関数を作ろうとするのは、私の悪い癖です。

しかも、質問のタイトルが名前に。orz
天然で、あほな子で、すいません。

再度締め切りなので、回答なしでお願いいたします〜。
お騒がせしました。^^


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

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






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