<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" .. >タグがある場合もあります。
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>
ありがとうございます。
実はhtmlファイルを丸ごと読み込んで、正規表現で変更するという処理をこの前にしています。
ですので、できれば1行ごとの処理でなく、html丸ごとに対して変換できるような正規表現が可能であれば教えていただきたいです。
それなら </div> が1行に複数あろうが単体であろうが問題ないですよね。
No.3
- 回答日時:
http://search.cpan.org/search?query=XML+Parser&m …
http://search.cpan.org/search?query=SGML+Parser& …
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でした。
しかし即興によるコードなので動く保証はありません。参考程度にお願いします。
HTML::TagParser を使ってみました。
getElementsByTagName( "div" ) で div タグの一覧を取得し、
attributes で属性と指定値が class="center" となるものを選別まではできますが、
そのノードの中身全部を取得するメソッドがないみたいです。
ノードの中のテキストを取得する innerText というメソッドはありますが、img タグは取得できません。
これが取得できれば、あとは img タグの class="right" を正規表現で削除するだけなんですけどね・・・。
いただいた方法なんですけど、No.4 と同じく1行ごとの処理ではなく、
$html にHTMLのソースがすべて入っているとしたときに
どうしたらよいか教えていただけないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- HTML・CSS CSSがなぜかfont-sizeだけ効かない...記述がまちがっているんでしょうか 5 2022/04/09 17:52
- HTML・CSS PCサイズで赤い画像2つと、青い画像2つがそれぞれ横に2つずつ並んでいるのですが、これをスマホサイズ 5 2022/04/11 12:01
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS img と p を縦中央に配置したいのですがうまくいきません。 2 2023/01/12 14:38
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
- HTML・CSS サルワカさんの吹き出しのスタイルシートについて。 https://saruwakakun.com/h 2 2022/10/28 22:55
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Strawberry Perl for Windows ...
-
PerlでUTF-8のファイルの文字列...
-
Perlのエラーについてご教授く...
-
画像が表示でnull; this.src
-
Perlで特定文字列から特定文字...
-
INDIRECT 横に再度抽出したい
-
Wallpaper Engineでおすすめの...
-
perlで2次元配列をサブルーチ...
-
アルファベットに付いて質問し...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
Perlで時間の計算
-
ペプシコーラとコカ・コーラとD...
-
Perl の外部モジュールの利用方法
-
PERL
-
Perlでファイルの末尾から指定...
-
vlookupがうまくいきません、教...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
Perl の外部モジュールの利用方法
-
Perlのエラーについてご教授く...
-
テキストファイルで提出とは?
-
bashスクリプト
-
Windows10においての『Perl』の...
-
perlのflock関数でロックをかけ...
-
Perlで特定文字列から特定文字...
-
perlプログラミング 空白行削除
-
画像が表示でnull; this.src
-
ターミナルで特定の文字と文字...
-
Wallpaper Engineでおすすめの...
-
perl 正規表現でエラー
-
perlで複数のファイルの処理に...
-
perlでリテラル値はメモリにど...
-
このファイルを開く方法で困っ...
-
LinuxにおいてのPerlのプログラ...
-
PerlでUTF-8のファイルの文字列...
おすすめ情報