- ベストアンサー
Perlにてフォームに入力したhtmlの<>タグの外の半角スペース削除
- Perlのバージョンは[5.10.0]です。下記の様なhtmlから<>の外側の半角スペースを削除する方法を教えて下さい。<>の外側でスタイル指定部分の半角は残す必要があります。
- 確認するボタンを押すと、自動的に「<」の前のスペースとタブが削除されて表示していますが、記入時は「<」の前にはタブと半角スペースがあります。
- よろしくお願い致します。ご回答頂くにあたり必要事項の追加が必要で有ればご指摘下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>上記の内容は$html =~ s#AAAA#BBBB#egs;と理解すれば良いのでしょうか? はい、そうです。 一般的にs///の形式で用いられる区切り文字を#にしたものです。 { と } が単独で使われると消失するというバグを発見したので以下に修正させてください。 $html =~ s#((?<=<style type="text/css")>\n*<!--.+-->\n*(?=</style>)|>.+?<)# join q{}, map { /^{.+}$/s or tr/ \t//d; $_ } $1 =~ /{.+?}|[^{}]+|[{}]/gs; #egs; 上記コードを分かりやすく分解しました。 参考にしてください。 $html =~ s#((?<=<style type="text/css")>\n*<!--.+-->\n*(?=</style>)|>.+?<)# my @matched_strings = ( $1 =~ /{.+?}|[^{}]+|[{}]/gs ); my @trimmed_strings = map { /^{.+}$/s or tr/ \t//d; $_ } @matched_strings; my $trimmed_string = join q{}, @trimmed_strings; #egs; 実は本日より2~3ヶ月入院します。 そのため、追加質問されましても回答できませんので、もし、上記コードが分かりにくければ、新たに質問を立ててください。
その他の回答 (2)
- ryu_chan
- ベストアンサー率37% (69/186)
以下コードで一応、希望通りの結果が得られました。 もっといい回答が得られるかもしれませんので、しばらくオープンにされたほうがいいかと思います。 my $html = <<'END_OF_HTML'; <style type="text/css"> <!-- #container{*****} h1{border-right:solid #e4dac6 2px;} .discript0 { margin: 0; border-right:solid #e4dac6 2px; } #col_1{****} --> </style> <div id="container"> <h1>** ***</h1> <div id="col_1"> <p class="discript0"> 123123 121 23 </p> </div> </div> END_OF_HTML $html =~ s#((?<=<style type="text/css")>\n*<!--.+-->\n*(?=</style>)|>.+?<)# join q{}, map { /^\{.+\}$/s or tr/ \t//d; $_ } $1 =~ /\{.+?\}|[^{}]+/gs; #egs; print $html;
補足
ご回答有り難うございます。 perl 初心者のため理解に時間がかかりそうです。 下記の内容について、教えて頂けないでしょうか? $html =~ s#((?<=<style type="text/css")>\n*<!--.+-->\n*(?=</style>)|>.+?<)# join q{}, map { /^\{.+\}$/s or tr/ \t//d; $_ } $1 =~ /\{.+?\}|[^{}]+/gs; #egs; 上記の内容は$html =~ s#AAAA#BBBB#egs;と理解すれば良いのでしょうか? AAAAとBBBBの内容を分解しながら理解を進めようと思います。
- ryu_chan
- ベストアンサー率37% (69/186)
<h1>** ***</h1>の** ***にある半角スペースは<>タグの外ですが、削除しなくていいのでしょうか? 削除しなくていいのなら、その判断基準は何でしょうか?
補足
質問者です。 こちらの欄に追加書き込みをすることが正しいかどうか疑問に感じながらも、探してみましたが 追加記入欄か見つからないので、こちらの欄に記入致します。 <h1>** ***</h1>の** ***にある半角スペースは<>タグの外であり削除します。 123123 121 23#<---「123123 121 23」の「123123」の前と「121 23」の間の半角スペース削除。 「123123 121」のスペースは全角スペースなので削除しません。 問題なのは、スタイルの中で 「<!--から-->」までの間にある半角スペースは削除しますが 「{}」の内側にある半角スペースを残す必要があることです。 説明不足で申し訳ありません。よろしくお願い致します。
お礼
有り難うございました。 $html =~ s#AAAA#BBBB#egs; まず、この方法をご紹介頂いたことで、大きく前進致しました。 perl初心者にとっては、「#」がrem文の頭のイメージが強くs///に至まで しばらく眺めていました。 #$html =~ s#((?<=<style type="text/css")>\n*<!--.+-->\n*(?=</style>)|>.+?<)#join q{}, map { /^\{.+\}$/s or tr/ \t//d; $_ } $1 =~ /\{.+?\}|[^{}]+/gs;#egs; 早速組み入れて、いくつかのhtmlをフォームに入れて実行すると、いくつかの<>内の半角スペースがなくなっていました。 なぜ???しばらくオリジナルと変更後を見くらべていると、「<」の前にスペースが有る場合と無い場合により違いが出ていました。 そこで*(?=</style>)|>.+?<)#部分の+を*に変更して実行すると満足のいく結果が出ました。 感謝感謝です。 $html =~ s#AAAA#BBBB#egs;この方法が解ったので、AAAAの部分は以前調べていたときに http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside「タグの外側だけ対象に置換する」というサイトを思いだし、AAAA部分を入れ替えてみました。いくつかのパターンで全て成功しました。 これからBBBBの内容を自分なりに理解して行きたいと思っていたら、本日よりわかりやすく分解して頂いたコードをご紹介頂き、またまた感謝、感謝!!です。有り難うございました。 助かりました。 最後になりましたが、ご入院とのこと、お体お大事に。 有り難うございました。
補足
漢字が一部文字化けが起こります。たぶん漢字コードの問題と思います。 お陰様で、初期の問題は解決致しました。有り難うございます。