指定のhtmlタグ以外削除No.08191
YY さん 16/08/15 10:13
 
題名の通り指定のhtmlタグ以外削除をしたいと考えております。


条件は3つあります。

残したいタグとそれに囲まれた文字列を残すパターン
<a href="URL">文字列</a> ⇒ <a href="URL">文字列</a>

次に消したいタグとそれに囲まれた文字列を消すパターン
<script>文字列</script> ⇒ 削除

最後に消したいタグとそれに囲まれた文字列を残すパターン
<div>あああ</div> ⇒ あああ


※タグに囲まれていない文字列があればそのまま残します。

今回は<a href>、<script>、<div>のみですが、今後タグを増やしていく予定です。

どのように条件式を作ればよいかご教授頂けますと幸いです。

[ ]
RE:08191 指定のhtmlタグ以外削除No.08192
でるもんたいいじま さん 16/08/15 10:32
 
こんにちは。秀丸ユーザの「でるもんた・いいじま」です。

> 残したいタグとそれに囲まれた文字列を残すパターン
> <a href="URL">文字列</a> ⇒ <a href="URL">文字列</a>
>
> 次に消したいタグとそれに囲まれた文字列を消すパターン
> <script>文字列</script> ⇒ 削除
>
> 最後に消したいタグとそれに囲まれた文字列を残すパターン
> <div>あああ</div> ⇒ あああ

これ、もっと詳細を詰めないといけませんね。
たとえば、こんなのはどうしますか?

<blockquote>
<p>サイトー企画さんのサイトから、<a href=
"http://hide.maruo.co.jp/software/hidemaru64.html"
>64bit版の秀丸エディタ</a>をダウンロードできます。
</blockquote>

この例だけでも、
 ・タグが三重の入れ子になっている。
 ・<a>の開きタグの途中で改行している。
 ・もちろん<blockquote>〜</blockquote>も複数行にまたがっている。
 ・</p>を省略している。
といった「想定外」が出てきています。

とてもとても、正規表現一発で解決できるようには思えません。
HTMLの文法解析を本格的にやらないと私にはどうにもならない
ように思えますが、他のマクロ作家の皆さんはどうお考えでしょうか?

[ ]
RE:08192 指定のhtmlタグ以外削除No.08193
YY さん 16/08/15 11:33
 
>こんにちは。秀丸ユーザの「でるもんた・いいじま」です。
>
>> 残したいタグとそれに囲まれた文字列を残すパターン
>> <a href="URL">文字列</a> ⇒ <a href="URL">文字列</a>
>>
>> 次に消したいタグとそれに囲まれた文字列を消すパターン
>> <script>文字列</script> ⇒ 削除
>>
>> 最後に消したいタグとそれに囲まれた文字列を残すパターン
>> <div>あああ</div> ⇒ あああ
>
>これ、もっと詳細を詰めないといけませんね。
>たとえば、こんなのはどうしますか?
>
><blockquote>
><p>サイトー企画さんのサイトから、<a href=
>"http://hide.maruo.co.jp/software/hidemaru64.html"
>>64bit版の秀丸エディタ</a>をダウンロードできます。
></blockquote>
>
>この例だけでも、
> ・タグが三重の入れ子になっている。
> ・<a>の開きタグの途中で改行している。
> ・もちろん<blockquote>〜</blockquote>も複数行にまたがっている。
> ・</p>を省略している。
>といった「想定外」が出てきています。
>
>とてもとても、正規表現一発で解決できるようには思えません。
>HTMLの文法解析を本格的にやらないと私にはどうにもならない
>ように思えますが、他のマクロ作家の皆さんはどうお考えでしょうか?

ご返信頂きありがとうございます。
おっしゃる通りHTMLの文法解析は必要不可欠だと思います。
ただ正規表現でどのくらい対応可能なのだろうという事で質問させて頂きました。

><blockquote>
><p>サイトー企画さんのサイトから、<a href=
>"http://hide.maruo.co.jp/software/hidemaru64.html"
>>64bit版の秀丸エディタ</a>をダウンロードできます。
></blockquote>

頂いた例の場合
<blockquote>、</blockquote>、<p>を置換で消す
<a href= </a>はそのままにして

サイトー企画さんのサイトから、<a href=
"http://hide.maruo.co.jp/software/hidemaru64.html"
64bit版の秀丸エディタ</a>をダウンロードできます。

上記のように出来ればいいかなと思っていました。
設定するタグでなんとか調整しようと考えています。

[ ]
RE:08193 指定のhtmlタグ以外削除No.08232
天翔記jp さん 16/08/16 21:54
 
■htmlをなかなか個人のパーサーで取り扱うってのは難しいところまで来ています。
なので、一般的には、HtmlAgilityPackなりNokogiriなりのパーサーを利用しますが、

それでも、とにかくライブラリといった話ではなく、
「考え方として、とっかかりとして」知りたい、
といういうことであれば、根本の所の流れだけ記載します。

下記のような考え方が正規表現でやろうが、ライブラリを使おうが共通です。

@「対象は全体である」からスタート
<blockquote>aaa<div>bbb<a ....>ccc</a>りんご<a ....>deeeee</a><b>bb</b></div
><blockquote>

A操作タグは, div, blockquote, a である。divの最小マッチで走査開始
<div>(bbb<a ....>ccc</a>afdfs<a ....>deeeee</a><b>bb</b>)</div>
divの最小マッチは以上のように見つかった。次の走査は( )内の文字列とする

対象の文字列は
bbb<a ....>ccc</a>りんご<a ....>deeeee</a><b>bb</b>である。
B操作タグは, div, blockquote, a である。divの最小マッチで走査開始
divは見つからない

C操作タグは, div, blockquote, a である。blockquoteの最小マッチで走査開始
blockquoteは見つからない

D操作タグは, div, blockquote, a である。blockquoteの最小マッチで走査開始
<a ....>(ccc)</a>\G
aの最小マッチは以上のように見つかった。次の走査は( )内の文字列とする

対象の文字列は
cccである
E操作タグは, div, blockquote, a である。
divの最小マッチで走査開始
divは見つからない
blockquoteの最小マッチで走査開始
blockquoteは見つからない
aの最小マッチで走査開始
aは見つからない

見つからないので、Dの\G以降に相当する残りの抽出文字列まで戻る。

F対象の文字列は
りんご<a ....>deeeee</a><b>bb</b>

同様にdiv, blockquote, aで走査して
<a ....>(deeeee)</a>\Gが見つかり、
deeeee
G操作タグがないので、\G以降の
<b>bb</b>
が対象の文字列。同様にdiv, blockquote, aの操作タグはない。

Hここまでで、「未走査部分がなくなっているので」どんどん上へと戻ってゆき、
<blockquote>aaa★<div>この★〜★範囲は全部走査済</div>★<blockquote>
Aはdivから始めたので、
 次のblockquoteを走査。
  見つかったので、
<blockquote>(aaa★<div>この★〜★範囲は全部走査済</div>★)<blockquote>

aaa★<div>この★〜★範囲は全部走査済</div>★
の中に、div, blockquote, a の未走査は無い。

全走査終了


この例では特に何か処理をしたわけではなく、「走査」をしただけです。
内部がどうなったのか、状態によらず一定のパターン処理に当てはめればよいように
しました。

このような方向性の考え方が基本です。

空白文字や複数行に分かれているだのは、開始タグにアトリビュートが何か付いてい
るといったことは付属的な要素です。
正規表現や「1文字以上の空白文字」「シングルライン」などのオプションでいける
でしょう。
ライブラリの場合は自分で考慮する必要はありません。


全体的には「再帰」に属する概念です。

秀丸だと文字列型の変数にモテる文字数が多分不足するので、
そちらの方が問題になりそうですね。



[ ]
RE:08191 指定のhtmlタグ以外削除No.08273
秀まるお2 さん 16/08/23 18:30
 
 今さらコメントさせていただきますが、正規表現の置換で簡単にやるとしたら、
例えばこんな感じでどんなもんでしょうか。

    replaceallfast "(?#maxlines:256)<script>(.|\\n)*?</script>", ""
                  , regular, nocasesense;
    replaceallfast "<(?!(a|/a)\\>)[^>]*?>", "", regular, nocasesense;


 <script>〜</script>は全面削除した上で、<a ...>と</a>タグ以外全部削除っ
てことなら、こんな感じになります。

[ ]
RE:08273 指定のhtmlタグ以外削除No.08276
YY さん 16/08/24 15:50
 
> 今さらコメントさせていただきますが、正規表現の置換で簡単にやるとしたら、
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>てことなら、こんな感じになります。

ありがとうございます。
大変勉強になりました。

[ ]