質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    24054questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Chrome

    776questions

    Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

  • Internet Explorer

    337questions

    Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

  • Firefox

    242questions

    Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

ブラウザの解釈【<? php】は【<!--? php】となぜ変換されるか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,688

te2ji

score 14256

こちらのサイトにも何度か質問がありましたが、php ファイルを作り損なったり、普通のhtmlファイルとして読ませた時、ブラウザが勝手に<? php<!--? phpと変換するようなのですが、これはどのような変換が行われているのでしょうか?

<? phpと間にspaceを入れてしまった場合 

<? php
echo "<html><body>Hello PHP</body></html>";
?>


ブラウザ表示は

Hello PHP"; ?>

その時の ブラウザ表示のソース?

<!--? php

echo "<html-->
<html><head></head><body>Hello PHP";
?></body></html>

実は私の環境では、ソースは上記に記載した内容ではなく、phpファイルの内容そのものだったので、正確に再現できているわけではないのですが、Chrome の elements をみる限り同じような表現になっていたので、質問者さんの環境では、ソースとして表示されているのだと思います。

ブラウザがレスポンスを勝手に解釈をしているのだと思いますが、その原理がわかっていないため、いつも正確な切り分けが出来ず、せっかくの機会なので理解したいなぁと。

これはレスポンスのどの部分にどのように反応した結果なのでしょうか?
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+8

もともとのテキストがHTMLとしては正しくない、間違っているというこことはわかりますよね。HTML5以降からは構文が間違っていて解析エラー(parse error)が起きた場合、どのようにエラーを回避するべきかパーサーの動作を細かく定義しています。エラー回避により元の文書に補完や置換が行われ、最終的に正しいHTMLとして解釈されます。パーサーの動作は仕様書の下記部分に記載してあります。

W3C勧告書: HTML 5.1 W3C Recommendation#8.2. Parsing HTML documents
WHATWG現行標準: HTML Living Standard#12.2 Parsing HTML documents
※ 内容は基本的に同じです。

HTML5以降に準拠しているブラウザであれば全て同じ動きになります。HTML5より前はブラウザ依存でしたが、HTML5からはブラウザ毎にエラー時の解釈に違いはなく、もしあればバグまたは非準拠です。では、どうしてそのようになるかというと、上の文書を読めばわかりますとしか言い様がありません。この節はユーザーエージェント(ブラウザ)やチェックツールの開発者向け情報なので、日本語訳でも該当部分は訳されていません。頑張って読んでください。(私は諦めました)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/31 11:02 編集

    > このようにエラーを回避するべきかパーサーの動作を細かく定義しています。
    この情報が知りたかったのですが、この方面に詳しくなかったため、たどり着けませんでした。
    やはり決まった動作があり、それに従っているのですね。
    特に
    > HTML5以降に準拠しているブラウザであれば全て同じ動きになります。
    これがしれたのが大変うれしいです。

    日本語訳、無いのかorz
    興味本位なので、どこまで追うか(追えるか)微妙ですが、確認してみたいと思います。

    ありがとうございます。大変助かりました。

    キャンセル

+5

的外れかもしれませんが。
HTML5のリファレンス内の開始タグについての項目には、以下のような記述があります。

  1. The first character of a start tag must be a "<" (U+003C) character.
  2. The next few characters of a start tag must be the element's tag name.
  3. Finally, start tags must be closed by a ">" (U+003E) character.

  1. 開始タグの最初の文字は<であること。
  2. 開始タグの2文字目からは要素のタグ名でなければならない。
  3. 開始タグは>で閉じられてなければならない。
    また、タグの名前に有効な文字は半角英数字です(大文字小文字不区別)。

<?phpと記述した場合

HTMLファイルに<?phpの記述があった場合1文字目に<があるため、正常なタグと判断してしまいます。
しかし、2文字目には?があり、?からはじまる有効なHTMLタグは存在しないので構文エラーとなります。
この構文エラーをパーサが修正したため、質問者さんのブラウザ表示のソースのような内容になったのではないかと思います。
パーサのエラー処理についてHTMLでは特に規定されていないはずなので、挙動はブラウザ依存としか言えませんが、質問者さんが使用したChromeでは以下のような段階を踏んだのではないかと推測できます。

  1. 構文エラーを修正するため、構文エラーのあった箇所をコメントアウトしようとして、<?php<!--?phpとする。
  2. その後、HTMLの文法に基づいてコメントアウトを終了させようとするので、構文エラーの箇所からいちばん近い>--をつけ、<!--?php echo "<html-->というコメントができあがる。
  3. HTMLタグをコメントアウトしてしまったため、HTMLタグを出力しなおす。
  4. HTMLタグ内にHEADタグを出力して、<body>Hello PHP</body></html>";?>を修正、HTMLタグ内に追加する。
  5. 結果、以下のようなHTMLになる。
<!--?php echo "<html-->
<html>
<head></head>
<body>Hello PHP";?&gt;</body>
</html>

< ?phpとした場合

< ?phpとした場合、空白文字はタグの名前に有効ではないので、<? php echo "<html><body>Hello PHP</body></html>";?>がそのままパーサに作成されたBODYタグ内に挿入されます。構文エラーであるecho内のHTML, BODYタグはパーサによって削除されたものと考えられます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/30 23:21

    回答ありがとうございます。
    構文エラーを起こした<と>の間をエラー回避のため、ブラウザがコメントアウトした副作用という説明と読みました。
    そこでいくつか試してみたのですが、同じような事象が`</`では再現したのですが、他の文字だと再現しませんでした。HTML5に関して正直あまりわかっていないのですが、構文エラー以外のトリガーもあるのでしょうか?
    挙動から追っていただいたのだと思うので、少し無茶ブリな気もしますが、もしわかれば教えてください。

    よろしくお願いします。

    キャンセル

  • 2016/12/31 16:23

    解決済みですが、返信させていただきます。パーサによるエラー処理は構文エラー以外にはないと考えられます。</で再現し、他の文字では再現しなかったのは、パーサの構文エラーの処理の仕方が異なるからではないかと。

    キャンセル

  • 2016/12/31 17:04

    ありがとうございます。
    すいません。無茶な質問しちゃって^^;

    キャンセル

同じタグがついた質問を見る

  • PHP

    24054questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Chrome

    776questions

    Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

  • Internet Explorer

    337questions

    Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

  • Firefox

    242questions

    Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ