HTMLタグの正規表現及び置き換えについてNo.29857
TAKATAKA さん 11/05/25 17:03
 
フォーラムの皆様

はじめて投稿させていただきます。
TAKATAKAと申します。

現在、秀丸エディタV8.01を利用しております。
正規表現を使って、HTMLタグを置き換える方法が
どうしても分からず、質問させていただきました。
以下がその内容です。


1.'<img'から始まり、最初の'>'が出るまでの間に、
'半角スペース+border="0"'が含まれる一文のタグから、
'半角スペース+border="0"'の部分を削除(置き換え)したい。

例1)<img border="0" height="300" src="test/images/image.gif" width="200">

例1)<img height="300" src="test/images/image.gif" width="200">
にしたい。

※但し、'半角スペース+border="0"'の位置は、固定ではなく順不同です。


2.'<img'から始まり、最初の'>'が出るまでの間に、
'半角スペース+width="200"'または'半角スペース+height="300"'が含まれる一文
のタグを、
'半角スペース+style="width:200px; height:300px"'に変換して、
'半角スペース+width="200"'および'半角スペース+height="300"'の部分を削除し
たい。

例2)<img border="0" height="300" src="test/images/image.gif" width="200">

例2)<img style="width:200px; height:300px" src="test/images/image.gif">
にしたい。

※但し、'半角スペース+width="200"'または'半角スペース+height="300"'の位置
は、順不同です。


ご存じの方がいらっしゃいましたら、ぜひ教えてください。
宜しくお願いいたします。

[ ]
RE:29857 HTMLタグの正規表現及び置き換えNo.29858
IKKI さん 11/05/25 19:14
 
TAKATAKAさん、こんにちは。ユーザの IKKI です。

> 1.'<img'から始まり、最初の'>'が出るまでの間に、
> '半角スペース+border="0"'が含まれる一文のタグから、
> '半角スペース+border="0"'の部分を削除(置き換え)したい。
こちらは置換で可能ですね。

 検索: (<img[^<>]*) border="0"([^<>]*>)
 置換: \1\2
 正規表現: ON

マクロなら
replacedown "(<img[^<>]*) border=\"0\"([^<>]*>)", "\\1\\2", regular;
です。

> 2.'<img'から始まり、最初の'>'が出るまでの間に、
> '半角スペース+width="200"'または'半角スペース+height="300"'が含まれる一文
> のタグを、
> '半角スペース+style="width:200px; height:300px"'に変換して、
> '半角スペース+width="200"'および'半角スペース+height="300"'の部分を削除し
> たい。
こちらは、width と height の出現順序が固定されていれば正規表現置換置換で
行けますが (考えてみてください)、順不同な場合は諦めた方がいいと思います。
# どうしても正規表現置換にこだわるなら、1回目の置換で出現順序を揃えておき、
# 2回目の置換で「style=」に変換する、という方法もあるかもしれませんが…。
まあ、悩んでる間にマクロを書いてしまいましょう。末尾に例を示します。

> 例2)<img border="0" height="300" src="test/images/image.gif" width="200">
> 例2)<img style="width:200px; height:300px" src="test/images/image.gif">
この例では「 border="0"」が消えていますが、下のマクロでは消していません。


setcompatiblemode 0x200;
loaddll "hmjre.dll";
searchdown2 "(?<=<img)[^<>]* (width|height)=\"\\d+\"[^<>]*>", regular;
if (result) {
$$tag = gettext(foundtopx, foundtopy, foundendx, foundendy, true);
$$width = "";
if (dllfunc("FindRegularNoCaseSense", ".* width=\"(\\d+)\".*", $$tag, 0) >=
0) {
$$width = "width:" + midstr($$tag, dllfunc("GetLastMatchTagPosition", 1), dl
lfunc("GetLastMatchTagLength", 1));
}
$$height = "";
if (dllfunc("FindRegularNoCaseSense", ".* height=\"(\\d+)\".*", $$tag, 0) >=
 0) {
$$height = "height:" + midstr($$tag, dllfunc("GetLastMatchTagPosition", 1),
dllfunc("GetLastMatchTagLength", 1));
}
$$newtag = dllfuncstr("ReplaceRegularNoCaseSense", " (width|height)=\"\\d+\"
", $$tag, 0, "", 1);
insert " style=\"" + $$width + "px; " + $$height + "px\"" + $$newtag;
}
freedll;

[ ]
RE:29858 HTMLタグの正規表現及び置き換えNo.29859
IKKI さん 11/05/25 19:23
 
書き忘れました。
ファイル内の全タグを一括処理したい場合は

if (result) {
 …中略…
}



gofiletop;
while (result) {
 …中略…
finddown2;
}

に書き換えれば OK です。

[ ]
RE:29859 HTMLタグの正規表現及び置き換えNo.29860
TAKATAKA さん 11/05/26 16:06
 
IKKIさんへ

TAKATAKAです。
早速のご教授ありがとうございます!
私は、マクロを使ったことがないので、
またお尋ねするかもしれませんが
その際には、宜しくお願いいたします。

これからマクロの登録方法などを調べ、
早速試してみたいと思います。

本当にありがとうございました。

[ ]
RE:29860 HTMLタグの正規表現及び置き換えNo.29861
TAKATAKA さん 11/05/26 16:58
 
IKKIさんへ

TAKATAKAです。
早速いただいたコードをマクロで実行したのですが、
何も動かない状態のようです。

以下のようなタグに対して行ったのですが、
お気づきの点等ございますでしょうか?

●対象タグ
<img border="0" height="300" src="test/images/image.gif" width="200">


●マクロファイルに保存したコード
------------------------------ここから
setcompatiblemode 0x200;
loaddll "hmjre.dll";
searchdown2 "(?<=<img)[^<>]* (width|height)=\"\\d+\"[^<>]*>", regular;

gofiletop;
while (result) {
 $$tag = gettext(foundtopx, foundtopy, foundendx, foundendy, true);
 $$width = "";
 if (dllfunc("FindRegularNoCaseSense", ".* width=\"(\\d+)\".*", $$tag, 0) >=
 0) {
  $$width = "width:" + midstr($$tag, dllfunc("GetLastMatchTagPosition", 1),
dllfunc("GetLastMatchTagLength", 1));
 }

 $$height = "";
 if (dllfunc("FindRegularNoCaseSense", ".* height=\"(\\d+)\".*", $$tag, 0) >
= 0) {
 $$height = "height:" + midstr($$tag, dllfunc("GetLastMatchTagPosition", 1),
 dllfunc("GetLastMatchTagLength", 1));
 }

 $$newtag = dllfuncstr("ReplaceRegularNoCaseSense", " (width|height)=\"\\d+\
"", $$tag, 0, "", 1);
 insert " style=\"" + $$width + "px; " + $$height + "px\"" + $$newtag;

finddown2;
}

freedll;
------------------------------ここまで

また、このマクロを基に、色々と似たような
置換えを行いたいと考えておりますので、
展開の肝となる部分だけでも
ご説明していただけないでしょうか?

お忙しい中大変お手数をおかけしますが、
どうぞ宜しくお願いいたします。

[ ]
RE:29861 HTMLタグの正規表現及び置き換えNo.29862
IKKI さん 11/05/26 19:31
 
TAKATAKAさん、こんにちは。ユーザの IKKI です。

> searchdown2 "(?<=<img)[^<>]* (width|height)=\"\\d+\"[^<>]*>", regular;
> gofiletop;
ごめんなさい、この2行があべこべでしたね (^^;
正しい一括処理マクロを末尾に書いておきます。

> また、このマクロを基に、色々と似たような
> 置換えを行いたいと考えておりますので、
まず、もしウェブサイトの大規模なリファクタリング等をお考えでしたら、
秀丸マクロよりも HTML 専門のソフトを活用すべき、と申し上げておきます。
秀丸で何でもやろうとするあまり目的と手段が入れ替わってはいけません。

もしプログラミングの経験をお持ちでないなら、秀丸マクロの入門用ヘルプ
を読みながら、載っているマクロを一通り作ってみることをお勧めします。
http://homepage3.nifty.com/kons/hidemaru/helpsite/be_hidemac/

正規表現についても同様に、HMJRE のヘルプを読みながら、試行錯誤して
理解を深められるとよいでしょう。
http://homepage3.nifty.com/kons/hidemaru/helpsite/hmjre/

マクロで使われている文や関数の詳細はマクロヘルプに書かれています。
文や関数の上にカーソルを置いてメニューからマクロヘルプを開いてみましょう。

dllfunc() の中で使われている FindRegularNoCaseSense などの説明は
HMJRE のヘルプの「マクロからの dllfunc 呼び出し」に書かれています。

> 展開の肝となる部分だけでも
> ご説明していただけないでしょうか?
ここまで来れば、あとは全体の流れが掴めれば理解できると思います。

1. searchdown でタグを検索 (ヒットした文字列を範囲選択)
2. gettext() でヒットした文字列を取得 (範囲選択はそのまま)
3. 取得した文字列内をさらに FindRegularNoCaseSense で検索して
 width と height を取得
4. width="" と height="" を ReplaceRegularNoCaseSense で削除して
 残りを $newtag に代入
5. 希望のフォーマットに整形して挿入 (選択されていた範囲を置換)
6. 次候補を検索
7. 2.に戻る

なんか回りくどいような気がしますが、あとで応用しやすいようにと思って
素直な書き方をしてたらこんな風になってしまいました。
もっと技巧的な書き方をすればもっと簡潔になるかもしれませんが、まあ
そのへんはお楽しみということで…。


setcompatiblemode 0x200;
loaddll "hmjre.dll";
gofiletop;
searchdown2 "(?<=<img)[^<>]* (width|height)=\"\\d+\"[^<>]*>", regular;
while (result) {
$$tag = gettext(foundtopx, foundtopy, foundendx, foundendy, true);
$$width = "";
if (dllfunc("FindRegularNoCaseSense", ".* width=\"(\\d+)\".*", $$tag, 0) >=
0) {
$$width = "width:" + midstr($$tag, dllfunc("GetLastMatchTagPosition", 1), dl
lfunc("GetLastMatchTagLength", 1)) + "px;";
}
$$height = "";
if (dllfunc("FindRegularNoCaseSense", ".* height=\"(\\d+)\".*", $$tag, 0) >=
 0) {
$$height = "height:" + midstr($$tag, dllfunc("GetLastMatchTagPosition", 1),
dllfunc("GetLastMatchTagLength", 1)) + "px;";
}
$$newtag = dllfuncstr("ReplaceRegularNoCaseSense", " (width|height)=\"\\d+\"
", $$tag, 0, "", 1);
insert " style=\"" + $$width + $$height + "\"" + $$newtag;
finddown2;
}
freedll;

[ ]
RE:29861 HTMLタグの正規表現及び置き換えNo.29863
IKKI さん 11/05/26 19:35
 
ちょっと探してみたところ、こういったサービスもあるようです。
http://www.escafrace.co.jp/codeexpress/

[ ]
RE:29862 HTMLタグの正規表現及び置き換えNo.29864
TAKATAKA さん 11/05/27 10:52
 
IKKIさんへ

おはようございますTAKATAKAです。
いただいたマクロでうまく動作いたしました!
ありがとうございます。

ちなみに前回ご報告し忘れましたが、
最初にいただいた検索/置き換え文も
バッチリ動いております。

これからIKKIさんに教えていただいた
ヘルプサイトなどを参考にして、
応用編のマクロを作っていきたいと思います。

また、大きな壁にぶつかった際には、
ご教授のほど、宜しくお願いいたします。

今回は、誠にありがとうございました。
本当に助かりました。

[ ]