• ベストアンサー

<div>タグの中の<img>タグのclass属性を削除したい

<div class="center"> .... <img ... class="right" ...> .... </div> とあるソースをperlを使って <div class="center"> ... <img ...> ... </div> というように img タグの class="right" を削除したいです。 <div class="center"> の中にあるimgタグのみ対象としたいのですが、 どうすればよいのでしょうか。 なお、<div class="center"> タグの中には複数の <img ... class="right" .. >タグがある場合もあります。

  • Perl
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

実際のファイルを処理するには、いろいろと難しい問題があるように思います。次の簡単な コードは、</div> を忘れているとダメ、複数の </div> が同じ行にあるとダメというもの ですが、出発点ぐらいにはなると思います。 use strict; my ($range_end, $depth, $r) = ('</div>'); while (<DATA>) { if ($r = /<div class="center">/ .. m!$range_end!) { s/(<img [^>]*?) ?class="right"/$1/; $depth = 0 if $r == 1; if ($r > 1 and /<div /) { $range_end = 'dummy_string' unless $depth; $depth++; } if ($depth and m!</div>!) { $depth--; $range_end = '</div>' unless $depth; } } print; } __DATA__ <div class="center"> <img src="xxx.gif" class="right" alt=""> (削除) </div> <div class="other"> <img src="xxx.gif" class="right" alt=""> (そのまま) </div> <div class="center"> <img src="xxx.gif" class="right" alt=""> (削除) <div class="other"> <img src="xxx.gif" class="right" alt=""> (削除) </div> </div> <div class="other"> <img src="xxx.gif" class="right" alt=""> (そのまま) <div class="center"> <img src="xxx.gif" class="right" alt=""> (削除) </div> </div>

yocean1201
質問者

お礼

ありがとうございます。 実はhtmlファイルを丸ごと読み込んで、正規表現で変更するという処理をこの前にしています。 ですので、できれば1行ごとの処理でなく、html丸ごとに対して変換できるような正規表現が可能であれば教えていただきたいです。 それなら </div> が1行に複数あろうが単体であろうが問題ないですよね。

その他の回答 (3)

回答No.3

http://search.cpan.org/search?query=HTML+Parser&mode=all http://search.cpan.org/search?query=XML+Parser&mode=all http://search.cpan.org/search?query=SGML+Parser&mode=all HTML::Parserのような名前をしたモジュールを使うのが正攻法だと思います。 しかし、属性を削除するために使ったことがないので具体的な手順までは分かりません。 そのため、私は正規表現で何とかしようと思い立ち、計算によって以下のコードを導き出しました: ----- #!/usr/bin/perl use strict; use warnings; my $flag; while (<>) { $flag and s/(<img(?= ).*?) class="right"(.*?>)/$1$2/; $flag = 1 if /<div(?= ).*? class="center".*?>/; undef $flag if m|</div>|; print; } ----- $ ./delete.pl index.html index2.html のように、コマンドライン引数としてtext/htmlファイルを渡すと、ご質問の処理を行った後のHTML文書を標準出力に出力します。 私の環境でテストしたところ、All tests successfulでした。 しかし即興によるコードなので動く保証はありません。参考程度にお願いします。

yocean1201
質問者

お礼

HTML::TagParser を使ってみました。 getElementsByTagName( "div" ) で div タグの一覧を取得し、 attributes で属性と指定値が class="center" となるものを選別まではできますが、 そのノードの中身全部を取得するメソッドがないみたいです。 ノードの中のテキストを取得する innerText というメソッドはありますが、img タグは取得できません。 これが取得できれば、あとは img タグの class="right" を正規表現で削除するだけなんですけどね・・・。 いただいた方法なんですけど、No.4 と同じく1行ごとの処理ではなく、 $html にHTMLのソースがすべて入っているとしたときに どうしたらよいか教えていただけないでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

や, 使ったことはないけど HTML の解析モジュールなんか探せばその辺に転がってるような気がする.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

div のネストを考慮するかどうかによるんだけど, まじめにやるなら何らかのモジュールを使ってソースを解析する. 手を抜いていいなら正規表現 (じゃないけど) +α で何とかなる.

yocean1201
質問者

お礼

div のネストもあります。 何らかのモジュールって、どんなモジュールがあるのでしょうか?

関連するQ&A

  • dlタグの中にdivは使える?

    dlタグの中で、dtタグとddタグを一つのdivで囲ってもよいのでしょうか?? 以下のようなかたちなのですが・・・。 使い方として間違っているのでしょうか?? ↓ ------------------------------------------------ <dl> <div class="aaa"> <dt>タイトル01</dt> <dd> <h4>説明文説明文説明文説明文説明文説明文</h4> <p><img ・・・・・></p> </dd> </div> <div class="aaa"> <dt>タイトル02</dt> <dd> <h4>説明文説明文説明文説明文説明文説明文</h4> <p><img ・・・・・></p> </dd> </div> <div class="aaa"> <dt>タイトル03</dt> <dd> <h4>説明文説明文説明文説明文説明文説明文</h4> <p><img ・・・・・></p> </dd> </div> </dl> ------------------------------------------------ dlタグの中には直接dtタグとddタグしか入れることができないということのようですが、 これはdivは入れられないということになるのでしょうか?? (dtはインライン要素のみ、ddはブロック要素もインライン要素も使えるということなので、 ddの中ではdivが使えると思うのですが・・・。) また、もしdivで囲えないとしたら、 今回の場合は、それぞれを一つのdlで囲ってしまうべきなのでしょうか?? ご存知の方いらっしゃいましたら、よろしくご指導ください。お願いします。

    • ベストアンサー
    • CSS
  • <img>タグにCSSのclass設定可能?

    <img>タグにスタイルシートのclassは、直接設定できるのでしょうか? 例えば,以下のようにテーブルの中にexample.jpgという画像があるとします。 <table border="4" width="250"> <tr> <td align="left"> <img src="example.jpg" width="100" height="100" borde="0"> </td> </tr> </table> この場合、<td align="left">とあるのでexample.jpgはセルの中で左揃えになって表示されます。 質問1: ここで、スタイルシート使用して、<td align="left">のまま、example.jpgをセルの中で中央揃えにして表示したいとします。また、スタイルシートを使用して、example.jpgの上下には10pxのマージンを設定します(ここでは、スタイルシートに関する質問のため、あえてhspaceは<img>タグに使用しません。)。スタイルシートの指定は、<head></head>内で行なうことにします。 この場合、以下のように<img>タグの中に直接classを設定できますか?できない場合は、その理由、正しいやり方等をお教え下さい。 <head> <style type="text/css"> .abc{ text-align:center; margin-top:10px; margin-bottom:10px: } </style> </head> <table border="4" width="250"> <tr> <td align="left"> <img class="abc" src="example.jpg" width="100" height="100" borde="0"> </td> </tr> </table> やはり、<div></div>で<img>タグを囲んで、 <head> <style type="text/css"> .abc{ text-align:center; margin-top:10px; margin-bottom:10px: } </style> </head> <table border="4" width="250"> <tr> <td align="left"> <div class="abc"> <img src="example.jpg" width="100" height="100" borde="0"> </div> </td> </tr> </table> などとするしか方法がないのでしょうか? 質問2: また、スタイルシートを使用せずに、上記のテーブルで<td align="left">のままexample.jpgを中央揃えにする方法はあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • HTML
  • <div class="div_1" class=

    実際のソースは <div class="div_1" class="div_2">test</div> なのに、 グーグルクロームのデペロッパーツールの elementsで見ると、 <div class="div_1">test</div> となっています。 そのためなのか、 class="div_2"のスタイルシートが適用されていません。 <div class="div_1" class="div_2"> という書き方は間違えなのでしょうか?

    • ベストアンサー
    • HTML
  • FFにおけるDIVタグ間の隙間について

    たびたびお世話になります。 自分なりにあちこち検索したのですが、解決できるものが見つかりませんでしたので、質問させていただきます。 今回初めてCSSを使ってHPを作成しているのですが、部分的に<DIV>~</DIV>と<DIV>~</DIV>の間に10px程の隙間が発生します。 IE系のブラウザでは特に問題ないのですが、Mozila系で再現されるようです。 どのようなタグを挿入、あるいは削除すれば解決できるでしょうか? 以下、該当部のタグになります。 【html】 <body> <div id="header"> <a href="http://****.jp/"> <img src="../img/images/images/title.jpg"width="207"height="33"> </a> </div> <div id="topphot1"> <div id="topphot2"> <!-- TOP画像入れ替える時はここのファイルを変更。横711px縦150pxのもののみ --> <img src="../img/topphoto.jpg" width="711px" height="150px" /> <!-- ↑↑↑ --> </div> <div id="q_menu"> <ul class="q_menu"> <li><a href="#"><img src="../img/icon_m.gif" width="23" heigh="23" /></a></li> <li><a href="#"><img src="../img/icon_s.gif" width="23" heigh="23" /></a></li> <li><a href="#"><img src="../img/icon_r.gif" width="23" heigh="23" /></a></li> </ul> </div> </div> <div id="m_menu"> <ul class="m_menu_ro"> <li><a href="#" class="bbs"></a></li> <li><a href="#" class="battle"></a></li> <li><a href="#" class="event"></a></li> <li><a href="#" class="hunt"></a></li> </ul> </div> 【css】 #header{ padding:0 auto 0 auto; margin:0 auto 0 auto; background-color:#7fd137; color:#ffffff; width:800px; height:33px; } #topphot1{ margin:0 auto 0 auto; padding:0 auto 0 auto; position:relative; background-color:#edf2e9; background-image:url(../img/images/HP_03.jpg); background-repeat:no-repeat; background-position:center; color:#696969; width:800px; height:220px; text-align:center; } #topphot2{ margin-top:8px; padding-top:8px; margin-left:auto; margin-right:auto; position:relative; color:#696969; width:711px; height:150px; text-align:center; } #q_menu{ position:absolute; left:50px; bottom:10px; } ul.q_menu{ width:69px; height:23px; margin:0px; padding:0px; } ul.q_menu li{ float:left; } 不慣れなもので、タグ自体がちょっと滅茶苦茶なカンジもするのですが…。 aタグ周囲の改行の削除、vertical-alignをbottomに設定するなどでは解消できませんでした。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • imgタグについて

    imgタグについて http://okwave.jp/qa/q5970749.html この件で質問させていただいてましたが、気になる事がありましたのでアドバイスください。 最初のタグーーーーーーーー img{border: 0; vertical-align:bottom;} ーーーーーーーーーーーーー <img src="/img/space.gif" width="100%" height="10px"/> IE8でimgタグのvertical-align:top;が反応して1px×1pxの透明の画像が縦に10px以上伸びてしまっていました。 ↓そこで、このように分ければいいとアドバイスいただきましたが、 .img1{border: 0;} .img2{border: 0; vertical-align:bottom;} imgタグは他のページでも使用しているため img{border: 0; vertical-align:bottom;}は変更出来ませんでした。 そこで、img2{border : 0;} とcssに書き込み <img2 src="http://www.itumonavi.jp/img/space.gif" width="100%" height="10px" /> にするとバグは解消されました。 ですが、html的に<img2~ というタグは見た事無いのですが、これは使っておいても問題ないのでしょうか? もし他に方法がございましたら教えてください。 【css】-------------------------- img { border: 0; vertical-align:top; } .img1 { border: 0; } 【html】-------------------------- <table width="635" height="31" border="0" cellspacing="0" cellpadding="0" bgcolor="#999999"> <tr> <td width="635">タイトル</td> </tr> </table> <table width="635" border="0" cellspacing="0" cellpadding="0"> <tr> <td colspan="3"><img src="/img/space.gif" width="100%" height="10px" class="img1"/><!-- スペース --></td> </tr> <tr> <td width="170" rowspan="2"><img src="img/sample.gif" width="170" height="170" alt="test" /></td> <td width="20" rowspan="2"><img src="img/space.gif" width="20" height="170" class="img1" /><!-- スペース --></td> <td width="445" style="vertical-align:text-top"><img src="img/space.gif" width="100%" height="5" class="img1" /><!-- スペース -->コピー<div class="guide-line"></div><!-- ライン --> </td> </tr> </table>

    • ベストアンサー
    • HTML
  • divタグについて

    初心者です。 xhtml+cssでdiv idというタグを何箇所にも利用してますが、div classはどういうときに使うんですかね?

    • ベストアンサー
    • HTML
  • aタグの中にあるimg二つを中央ぞろえにしたい

    aタグの中にあるimg二つを中央ぞろえにしたい場合どのように行いますか? pにtext-align: center;をつけてもダメでした。 インライン要素のなかにインライン要素があり中央ぞろえにする場合どのようにするのでしょうか? <p class="c-logo-wrap--small"> <a class="u-ta-c" href="http://portfolio-2/index.html"> <img alt="ロゴ" src="img/common-img/icon.png" /> <img class="c-corporate-name" alt="和食通" src="img/common-img/corpolate-name.png" /> </a> https://jsfiddle.net/j84dh5q2/1/ </p> https://jsfiddle.net/j84dh5q2/1/ text-aline:center;はその子孫要素に当たるインライン要素をすべて左右真ん中にするということではないのでしょうか? それはあっていても親がaなどのインライン要素の場合は使えないのでしょうか?

    • ベストアンサー
    • CSS
  • スタイルシートで、id属性の中にclass指定をすることはできますか?

    CSSで、id属性の中にclass指定をすることはできますか? 現状は、divタグを使って、ヘッダー、メイン、フッターと分けているのですが、メインのところで #main.hoge{ #main .hoge{ とも動きませんでした。なんとなく間違っている指定なのかなとはおもうのですが、id属性で細かく分けた中をclassで指定したい場合、単に.hogeで十分機能するのですが、id属性の中をclassで指定したい場合、皆様はどのようにされてみえるのでしょうか。

    • ベストアンサー
    • HTML
  • タグに関して質問です。classって

    よくホームページのソース表示をすると、<div class~>とかありますけど、classっていったい何ですか?<table>にも、<table class>とか書いてありますけど、classが書いてあるのと無いのと何が違うのでしょうか?

    • ベストアンサー
    • HTML
  • imgタグとレスポンシブについて

    imgタグとレスポンシブについて imgタグなどのようなインライン要素は、 ブロック要素で囲まないといけないと聞いたのですが、下記のような形でナイトいけないのですよね 下記のように直前にブロック要素で囲まれていないといけないのでしょうか? <div class="copyright"> <img src="img/base/copyright.png" alt="のコピーライト" width="382" height="24" /> </div> 下記のように直前にブロック要素で囲まれていないといけないのでしょうか? それとも直接ブロック要素で囲まれていなくてもずっと先にブロック要素があってそこから入れ子になっていればいいのでしょうか? ~ <td class="copyright"> <address> 〒***-*** **県**市**町 1-5-10 <span>TEL.0977-84-****</span> </address> <ul class="futtnavi"> <li><a href="http://index.html"><img src="img/base/sitemap.png" alt="サイトマップ" width="101" height="18" /></a></li> <li><a href="http://index.html"><img src="img/base/sitemap.png" alt="サイトマップ" width="101" height="18" /></a></li> </ul> <img src="img/base/copyright.png" alt="会のコピーライト" width="382" height="24" /> </td> ~ 下記はだめですよね。 <H2>画像</H2> <IMG src="img/img0.jpg" width="120" height="90" alt="写真" border="0" align="top"> 文字が上揃えになります<BR> <BR> <IMG src="img/img1.jpg" width="120" height="90" alt="写真" border="2"> 枠の太さを2にしています<BR> <BR> <IMG src="img/img2.jpg" w また、もうひとつになってしまうのですが、下記のimg をフルイドイメージにしたい場合は画像のたて、横はば割る直前のブロック要素のtdのwidthと縦幅(クロームのf12で出てくるpx)で出した%を ul.futtnavi+img { width: 67.3%; height: 18%; } のように入れれば良いのですよね。 tdのサイズは567px,133px imgは382、24です。 うまくぴったりのサイズになりません。 スマホでは消えます。 またtdの中の内容が増えた場合毎回計算しなおさないといけないのでしょうか? ~ <td class="copyright"> <address> 〒***-*** **県**市**町 1-5-10 <span>TEL.0977-84-****</span> </address> <ul class="futtnavi"> <ul class="futtnavi"> <li><a href="http://index.html"><img src="img/base/sitemap.png" alt="サイトマップ" width="101" height="18" /></a></li> <li><a href="http://index.html"><img src="img/base/sitemap.png" alt="サイトマップ" width="101" height="18" /></a></li> </ul> <img src="img/base/copyright.png" alt="会のコピーライト" width="382" height="24" /> </td>

    • ベストアンサー
    • CSS