• ベストアンサー

閉じタグの置換方法

お世話になっております。 @usable_A = qw(太 斜 …); @usable_B = ('SPAN class=B','SPAN class=I' …); と設定して、フォームからの入力データ ●<太><斜>かにみそ</斜></太> を ●<SPAN class=B><SPAN class=I>かにみそ</SPAN></SPAN> と変換してログに入れるようにしました。 このデータを編集する際、フォーム内での表示を ●<太><斜>かにみそ</斜></太> に戻したいのですが、</SPAN>を</斜></太>にするにはどのようにすれば良いのでしょうか。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.4

閉じタグが</SPAN>であると決め打ちしてしまいます。 my @usable_A = qw(太 斜); my @usable_B = ('SPAN class=B','SPAN class=I'); my $str = '<SPAN class=B><SPAN class=I>かにみそ</SPAN></SPAN>'; my %B2Atable = map { $usable_B[$_] => $usable_A[$_] } 0..$#usable_B; { local $" = '|'; 1 while $str =~ s#<(@usable_B)>((?:(?!<(?:@usable_B)>).)+?)</SPAN>#<$B2Atable{$1}>$2</$B2Atable{$1}>#; } print $str; #<太><斜>かにみそ</斜></太> 他に無関係なSPANが存在する時はHTML全体をパースすることになりそうです。

pantonenezu
質問者

お礼

御回答有難う御座います。 問題無く動作致しました。 無関係なSPANを入れて試してみましたが、支障は無いようでした。

その他の回答 (4)

  • SE-1
  • ベストアンサー率57% (26/45)
回答No.5

# HTML の構造によっては希望通りに動きませんが・・ # そしてハッシュは#4さんのぱくりですが・・・ use strict; my @usable_A = qw(太 斜 下); my @usable_B = ('SPAN class=B','SPAN class=I', 'SPAN class=U'); my $usable_B2=join "|", @usable_B; my %B2Atable = map { $usable_B[$_] => $usable_A[$_] } 0..$#usable_B; my $html; { local $/; $html=<DATA>; } while ($html=~/<($usable_B2)>(.+)<\/SPAN>/){ my $sub ="<$B2Atable{$1}>$2<\/$B2Atable{$1}>"; $html=~s/$&/$sub/; } print $html; __DATA__ <HTML> <HEAD> </HEAD> <BODY> ここから <SPAN class=B><SPAN class=I>かにみそ</SPAN></SPAN> Ushiro 区切り <A HREF=...>LINK</A> Mae <SPAN class=U><SPAN class=I><SPAN class=B>うに</SPAN></SPAN></SPAN> </BODY> </HTML>

pantonenezu
質問者

お礼

御回答有難う御座います。 どうもエラーが出てしまうようです。 読解力が甚だ不足しているので、どこをどう弄れば良いのかも判らないのですが。 HTMLの構造が違うということ…ですか…ね?? 話は逸れますがclass名やら読まれていて笑いました。

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.3

$stringに変換対象の文字列が入っているとします。 while($string =~ m/<SPAN class=(?:B|I)>[^<>]+?<\/SPAN>/){ $string =~ s/<SPAN class=I>([^<>]+?)<\/SPAN>/(斜)$1(\/斜)/i; $string =~ s/<SPAN class=B>([^<>]+?)<\/SPAN>/(太)$1(\/太)/i; } $string =~ s/\(/</g; $string =~ s/\)/>/g; まず、最短マッチで、内側のspanを置換します。但し、いきなり<斜>や<太>にしてしまうと次のマッチがヒットしなくなってしまうので、とりあえず(斜)と(太)に置換して、最後に<>に戻しました。

pantonenezu
質問者

お礼

御回答有難う御座います。 問題無く動作致しました。 ただ、使えるタグ、というか修飾の種類を増やす場合は書き加えなければいけないのですよね? ちょっと手間かも…我が儘で済みません。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

質問の答えにはなっていませんが。 変換せずにログに保存。 表示する時にはその都度変換。 編集フォームにはログにある元データをそのまま表示。 効率は悪いのですが、データはなるべくオリジナルのまま保存しておいた方が何かと都合がよいような気がします。(理由は?と聞かれても経験上としか答えられませんが)

pantonenezu
質問者

お礼

表示の際に都度変換というのも考えてはみたのですが、ログ数が多かったり変換数が多かったりしたら遅くなりそうな気が致しまして。それなら投稿・編集の際に一記事だけを変換するのが良いかと。 …そんなことはないのでしょうか…。 ともあれ、御回答有難う御座いました。

回答No.1

置換で徐々に変換するとか。 はじめからxslとかを使ってしまうとか? 戻すより変換前のデータを使った方が良いと思いますが。 </span></span> ↓ </斜></span> ↓ </斜></太> ログに出すときにきちんと改行していれば そこまで一気に正規表現で引っ掛ける事も出来るのですが。

pantonenezu
質問者

お礼

御回答有難う御座います。 徐々に変換する、その条件というか判定の仕方?がわからないもので…。 修飾を施して記事投稿するもので、</SPAN>の順番とか数とかは任意なのです。「class=~」部分がマッチしたら閉じタグも決定されることになるとは思うのですが…?(思考がここで止まります) 他の情報と一緒に<>で区切られておりますが、改行はしてあります。 何か良い案がありましたら、また宜しくお願い致します。

関連するQ&A