不特定多数の絵文字を消去消して、名前だけにしたいのですが。
<img src="./emoji.gif" alt="揺れるハート" />名 前<img src="./x-emoji.gif" alt="失恋ハート" /><img src="./tuba.gif" alt="豚" />
すべての<img 〜 /> を消して、名前だけにする方法です。
絵文字はどこに現れるかわかりません。
これって正規表現コンポーネント(Delphi6)で、可能でしょうか?
もしくは、別の方法で、可能な方法を教えてください。
PosとCopyでいけると思ったんですが、面倒そうなので、正規表現と思って調べたのですが、どうもうまくいかなくって。
よろしくお願いいたします。
>と<の場所だけ特定すれば、その間の文字列を抜き出せばOKだと思いますけど、
それじゃだめ?
Posでできる。
宿題丸投げはやめた方がいい。
まず、宿題ではないですし、たとえ宿題だとしても、何か問題でしょうか?
Posは、文字列中から指定された文字列を検索し、その位置を返す関数と記憶しているのですが。
場所の特定の仕方は、どうすれば簡単でしょうか?
不特定多数の絵文字なので、名<img src="./emoji.gif" alt="揺れるハート" />前<img src="./x-emoji.gif" alt="失恋ハート" />で<img src="./tuba.gif" alt="豚" />す
という可能性もあるので。ループか、再帰は必要だと思うのですが。
賢者の皆さん、お知恵を拝借できれば。
1 < を探す。
2 その次に現れる > を探す。
3 その間を削除。
4 1から4までを < がなくなるまで続ける。
必要な関数
・Pos または AnsiPos
・Delete
とりあえずコード書いてみれば?
ご無沙汰してます。
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準拠となりますとまだまだ不備ですし、速度的にも最高ではありません。
考え方ということでわかりやすくしてあります。
PosじゃなくてPosEx だな
書いてみたら、ちゃんと動くやつが10行くらいでできましたよ。
けっこう簡単だから挑戦してみたらどうでしょうか。
みなさん、ありがとうございました〜。
ところで、<>だと、”<なまえ>”の場合になまえが消されちゃいますね。^^;
だから、
<img 〜 /> を消して・・・と書いたのですが、説明不足でしたかね。
さすがに、<img名前/>という名前はいらっしゃらないと思ったもので。^^;
まぁ、どちらも例外と切っちゃってもいいんですが。
Delphi 6 Personalだと、PosExでヘルプで見つからないのですが。
とはいえ、いろいろとヒントをいただいて、参考にしてみます。
だったら、
1 <img を探す。
2 その次に現れる /> を探す。
3 その間を削除。
4 1から3までを <img がなくなるまで続ける。
で十分だと思いますが。十分すぎるヒントではありませんか?
repeat
iStart := pos('<img', text);
iEnd := pos('/>', text)-iStart+2;
if iStart > 0 then
Delete( text, iStart, iEnd);
until iStart = 0;
こういうことですか?
PosEx は StrUtils にある
HTML上 < と > は
< .... <
> .... >
となっていて
<なまえ>
はありえない
usesにStrUtils を追加しても、
[エラー] Unit1.pas(58): 未定義の識別子 : 'PosEx'
とでますねー。
>Delphi 6 Personalだと、PosExでヘルプで見つからないのですが。
と書いたので、私個人の環境が変なのか、ヘルプを信じると、使えないようです。
>HTML上 < と > は
実は、HTMLのソースではないんですよ。
HTMLのソースとは明記していませんし。^^;
すべての<img 〜 /> を消して、名前だけにする方法、と書いたので、その通りです。
とはいえ、書かれていないことを想像して頂くのは、大変ありがたいと思っています。
質問の直接の回答より、優れた方法がある場合もあります。
回答、ありがとうございます。
VB荒らしまくってる例の人ですね。
無視が一番です。
ごめん、それは別人。(苦笑
確かに、締め切ってから、書き込みをしているけど、それは補足、お礼、訂正というか、、、。
そういうのはダメなのかな?
だって、回答が付いたのに、なにかコメントしない方が無視したって事で失礼じゃない?
あ、それとも、私のことではなく、
「PosEx は StrUtils にある」とか、書いている人の事?
だったら、違うよ。
Delphi 6 Personal(私のだけかな?)には、なかっただけで、他のバージョンではそうなんじゃないの?
古いDelphiを使っている私のも非があるし、勘違いだってあるでしょ?
本物はアセンブラだけど
機能的にはこんな感じ
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 で開始位置を指定できる
ところで
<img />aaa<img />bbb<img />
とかあった場合 aaa と bbb を個々に抜き出す必要はなく
aaabbbでいいのかな?
あ、回答ありがとう。
区切り文字ではないので、そこは問題ないです。
でも、検索の開始位置を指定できるのは、PosEx便利ですね。
そうだ、<img />を消す事だけではなく、いろいろな置換に応用できる関数を作ろうと、頭の隅で思っていたから、混乱したんだ。^^;
Posだと、置換するワードに、置換するワードが含まれていると、無限ループになるし。
text := 'abcdefg';
aをaaにするとして、Posで置換ループすると、検索位置を指定できないので、aがaaになって、aaaaになって、無限に。
だから、ポインタを使って・・・、なんて頭の隅で考えてたから、こんなあほな質問を。
あ、これはまだ必要ないし、自分で考えてもみますね。
無駄に汎用性の高い、関数を作ろうとするのは、私の悪い癖です。
しかも、質問のタイトルが名前に。orz
天然で、あほな子で、すいません。
再度締め切りなので、回答なしでお願いいたします〜。
お騒がせしました。^^
ツイート | ![]() |