HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0528
ハゼHSPでHTMLコードの解析6解決


ハゼ

リンク

2018/5/28(Mon) 17:41:12|NO.84516

こんにちは。
現在、HSPでHTMLファイルを数値文字参照
に一括変換するソフトを作っています。
ですがただ単に英数字以外を変換するだけでは
javascriptやcssのコードが含まれていると
scriptタグやstyleタグの中までエンコードされてしまいます。
javascriptやcssを使ったページでテストした結果、
cssのフォントを指定する部分が変換されてしまい、バグが発生してしまいました。
なのでscriptタグやstyleタグの囲まれたの部分のみを変換させないようにしたいです。
今の状態はとりあえずメモリーノートパット命令を使用して
読み込んで変換して保存している状況です。
いい解決の方法があればお願いします。



この記事に返信する


あらや

リンク

2018/5/28(Mon) 22:17:10|NO.84520

なんらかのフラグ変数を使うのが良いのではないでしょうか。

変換処理中に『<script』という文字列が見つかれば非変換フラグを1に
非変換フラグが1のときに『</script>』という文字列が見つかったら非変換フラグを0にする

といった感じで、非変換フラグが1のときには変換しないように
if文で分岐させれば出来ると思います。



GENKI

リンク

2018/5/28(Mon) 23:36:32|NO.84521

正規表現で上手く処理できないかとちょっと考えてみたけど思いつきませんでした…。

scriptタグの抽出
<script[^>]*>.*</script>

scriptタグを含まない行の抽出
^(?!.*(<script[^>]*>.*</script>)).*$

このへんまでは考えてみたんですが…うーん。


> scriptタグやstyleタグの中までエンコードされてしまいます。

HTMLを数値文字参照にするのは、HTML内でHTMLタグを表示するためだと思うのですがそれとは異なる用途でしょうか。
preタグ内で表示するだけなら<と>だけ変換すれば十分ですし、埋め込まれたcssまで変換されても何も問題ないのですが…何をしようとしているんだろう。


> cssのフォントを指定する部分が変換されてしまい、バグが発生してしまいました。

cssでfontプロパティを指定している部分が、という解釈でいいのでしょうか。それならその部分だけ手作業で修正したら改善されましたか?


> バグが発生してしまいました。

症状が分からないので原因も対処もわかりません。
私の予想では、テキストファイルに出力する際の文字コードの間違いじゃないだろうかと…いやいや…もう少し情報無いとわかりません。



ハゼ

リンク

2018/5/29(Tue) 18:37:47|NO.84526

>症状が分からないので原因も対処もわかりません。

大変申し訳ありませんでした。情報が不足していました…
バグ?(というよりは不具合?)が発生したHTMLのコードと症状を書いておきます。

<HTML> <head> <TITLE>こんにちは。</TITLE> <style> body{ font-family: "MS ゴシック",MS GOSIC } </style> </head> <body> <script> alert("あ"); </script> あいうえお </body> </HTML>
といった感じです。
このソフトではHTMLソースを表示するソフトではなくwebページのまま
タグはそのままで全角文字だけ数値文字参照に変換するソフトです。
症状としてはfont-familyの"MS ゴシック"のところが変換されてしまい、
ページ上のフォントが正しく表示されなくなるのと
javascriptのアラート上での文字列も変換されてしまい、表示される文字列が変になるところです。

一言でいうとscriptタグとstyleタグ内は変換したくありません。

長い説明になりましたがよろしくお願いします。



ハゼ

リンク

2018/5/29(Tue) 21:37:40|NO.84528

補足です。
一応実装されている部分の処理を書いておきます。

文字数を数える

数えた文字数だけrepeatで繰り返す。

変数cnt番目の文字を一文字切り出す。

その文字が全角文字だったらconvwtos命令でunicodeに変換し、変数に代入する。
半角文字だったらそのまま変数に代入する。

&#と;と連結する。



GENKI

リンク

2018/5/29(Tue) 22:44:24|NO.84530

詳細情報ありがとうございます。状況がよくわかりました。
全角文字だけ数値文字参照


最初にstyle/scriptタグがどこにあるかを調べてから、必要な範囲だけを切り出して作業。とかどうでしょう。


#include "mod_regexp.as" a={" <HTML> <head> <TITLE>こんにちは。</TITLE> <style> body{ font-family: "MS ゴシック",MS GOSIC } </style> </head> <body> <script> alert("あ"); </script> あいうえお </body> </HTML> "} ;gr_2byte = "[^!-~\r\n\t ]" ; 2バイト文字 ;gr_tags = "<[^<>/]+>" ; 開始タグ ;gr_tage = "</[^<>]+>" ; 終了タグ gr_styles = "<style[^<>/]*>" ; style 開始タグ gr_stylee = "</style>" ; style 終了タグ ;gr_scripts = "<script[^<>/]*>" ; script 開始タグ ;gr_scripte = "</script>" ; script 終了タグ ;styleタグの位置を調べる matches s, a, gr_styles, 0, 0, 0 matches e, a, gr_stylee, 0, 0, 0 sidx = instr(a, idx, s(cnt)) eidx = instr(a, idx, e(cnt)) mes "---" idx = 0 mes strmid(a, idx, sidx) mes "---" idx = eidx + strlen(e(0)) mes strmid(a, idx, strlen(a))


あるいは、styleタグやscriptタグは必ず中では{〜}で囲まれているので、{〜} と 全角文字 だけを抽出して作業とか…。

gr = "{[^{}]*}|[^!-~\r\n\t ]+" ; {〜} または 全角文字 matches b, a, gr, 0, 0, 1 repeat stat mes "全角:"+b(cnt) loop


> 変数cnt番目の文字を一文字切り出す。
これならあらやさんのやり方が実装しやすいかもしれませんね。


1文字ずつ処理は、昔個人的にとても大変だった(でもちゃんと作った)思い出があるので、つい正規表現で一括処理とかをおすすめしてしまいます。



ハゼ

リンク

2018/5/30(Wed) 21:55:54|NO.84534

>あらやさん
シンプルで分かりやすく教えてくださり、
ありがとうございました。
>GENKIさん
分かりやすいアドバイスを
ありがとうございました。

フラグとか使って開発をがんばります。



ONION software Copyright 1997-2023(c) All rights reserved.