- 締切済み
htmlソースの中にコメントタグ(<!-- -->)があった時のPHP
htmlソースの中にコメントタグ(<!-- -->)があった時のPHPの処理で困ってます。 入力フォームからHTMLソースを入力し、DBに登録するという処理をやってます。 <!-- <p>ソース</p> -->の場合は良いのですが、 <!-- <p>ソース</p> <p>ソース</p>--> など、入力ミスでコメントタグが正しく入力されていない場合、 コメントタグそのものを置換してなくしてしまおうと思っています。 そこで、肝心の <!-- <p>ソース</p> -->の場合:タグは消さない <!-- <p>ソース</p>の場合:<!--タグを消す <p>ソース</p>-->の場合:-->タグを消す の分岐がどうやれば良いのか思いつきません。 どなたかご教授いただけますでしょうか。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- yuu_x
- ベストアンサー率52% (106/202)
strict に扱うなら、受け取った段階で、解析エラーを返してやればいい。 オレオレパーサを作るなら、それは自由。 まともなパーサなら、開始タグが現れた時点でそれ以降は子とみなし、包括しようとするだろう。 HTML5 の場合はもう少し複雑な処理が入るみたいだけど。
- yuu_x
- ベストアンサー率52% (106/202)
- JaneDue
- ベストアンサー率75% (263/350)
正規表現でまともに外そうとすると、意外と面倒です。 発想を変えて、きちんとしたコメントタグを一旦記号に変え、残りを削除してから戻すのはどうでしょう? //一旦、まともに閉じられたタグを自分だけの記号に置き変える(最右最短) $html = preg_replace("/<!--((?:(?!<!--).)*?)-->/s","<!++$1++>",$html); //残りはすべてペアではない、不正な記述とみなして削除 $html = preg_replace("/(<!--|-->)/","",$html); //先の記号を元に戻す $html = str_replace(array('<!++','++>'),array('<!--','-->'),$html);
- superside0
- ベストアンサー率64% (461/714)
> <!--<p>htmlソース</p> > <!--<strong>htmlソース2</strong>--> の場合は、 解釈としては、 ”<!--<p>htmlソース”から それを閉じる "-->"まで (上記では"</string>-->" まで)を コメントとするべきではないですか? また、"<!--"が始まって テキストの終わりまでそれを閉じる "-->"がない場合は、 "<!--" 以降を すべてコメントとして 削除してしまえば、 そのHTMLを 親HTMLの一部として組み込んだ場合のタグの狂いもなくなります。 どうやら、入力されはHTMLを、そのままHTMLの一部に組み込むタイプのプログラムのようですが、 セキュリティー的には、かなり危ない手法ですよ。 たとえば、ウィルス感染させるスクリプトを埋め込んだHTMLをフォームから入力した場合に とんでもないことになります。 せめて、安全なタグ以外は削除するようにstrip_tags()で、削除すべきです) <?php $str = "<p>あ<br>い<!-- う <i>え\n<!-- お -->か<!-- jjj <ul>\n"; $str = strip_tags($str,"<p><br><ul><i>"); echo $str; ?> とすれば、 <p>あ<br>いか となります。 つまり、最初の"<!--"から 途中の"<!--"は無視して "お"のあとの"-->"までを削除し さらに、"か"のあとの"<!--"から (最後まで閉じてないので)終わりまでを削除します。
- superside0
- ベストアンサー率64% (461/714)
<!-- ~ -->のコメントは1行でも複数行でも構わないので、 入力ミス扱いとすること自体が、おかしくないですか? 複数行のコメントも削除するなら、 HTML全体をfile_get_contents()で1つの文字列で読むか、 配列に読み込んでしまっているなら 一旦implode()で1つの文字列にしてしまって それを正規表現で、<!-- から 一番近くの-->まで(最短一致)でかつ、繰り返しマッチ(/g) を指定して削除してしまうのが簡単だと思います。 逆に、 <!-- -->が 1行のときのみコメントにしたいなら、 HTMLの1行毎のループを作って、 その中で、1行ごとに、<!--~-->までを示す正規表現で削除してしまえばよいと思います。
- athanasius
- ベストアンサー率37% (361/964)
データをストリームで受け取って、その後で、正規表現で「タグの間に折り返しがある」場合を 判定して処理すればいいんじゃないですかね。 ソースはご自身で考えるが良かろうと思います
補足
すみません、質問の書き方が悪かったです。 もちろん<!-- ~ -->のコメントは1行でも複数行でも構わないです。 ただ、入力されたコメントタグがちゃんと<!-- ~ -->の形になっていなくて <!-- ~ のみで最後まで書かれてしまった場合、 入力フォームのhtml(textareaとかです)そのものがコメント扱いになってしまい システムがおかしくなってしまうんです。 <html> <head> </head> <body> <!--<p>htmlソース</p> <!--<strong>htmlソース2</strong>--> </body> </html> 上記の <!--<p>htmlソース</p> のように <!--タグのみしか書かれていなかった場合、<!--タグを削除してしまいたいのです。 (<!--<strong>htmlソース2</strong>--> の場合は削除せずにそのまま) 正規表現を使うのだろうとは思ってるのですが、正規表現がよくわかっておらず 四苦八苦している状態です・・・。 もしよろしければアドバイスのほうお願い致します。