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

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

ただいまの
回答率

90.84%

  • PHP

    18649questions

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

phpでの文字列について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 172

auto_miss56

score -1

ランダムな文字列を配列に入れ、出力するプログラムです

<?php
$random_words = array(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"vmaoZxIG<MMDj0ggY$2suaojffhdsc",
"cccccccccccccccccccccccccccccc",
"dddddddddddddddddddddddddddddd"
 );

for($i = 0; $i < count($random_words); $i++){
  echo "</br>";
  echo $random_words[$i];
  echo"</br>";
}
var_dump($random_words);
?>

出力すると、配列の三個目が正しく出力されず
途中で消失したかのような表示になるのですが
ループそのものはその段階で止まっておらず
var_dump()の出力結果も
[2]=> string(30) "vmaoZxIG
となっています

また 

"vmaoZxIG<MMDj0ggY$2suaojffhdsc"

から、[ < ]を抜き、

"vmaoZxIGMMDj0ggY$2suaojffhdsc"

とすると、正しく、phpがコードを解釈してくれているように見えます

上記のコードの文字列を正しく、格納、出力、するためには
どのような手法を用いるのがよろしいでしょうか?

ご存知の方いらっしゃいましたらご教授願います

ver PHP 7.1.8

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

文字列の扱いならシングルクオーテーションにすれば解決のようですが、一度お試しください。

ダブルクオーテーションはPHPが自動で演算子を解釈してくれるので、PHPでは基本的にシングルクオーテーションを使うのがよいかと思います。$の部分も変数として扱われる可能性があります。通常は展開するのに波カッコが必要ですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/31 21:18

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

    キャンセル

  • 2017/12/31 22:18 編集

    今回の現象の原因はこれじゃなく、HTML エンティティへの変換の問題のはずだけれど。。。
    この内容で試してみました?

    念のため、4.0から7.1までの複数のVerの PHP でサンプルコードを動作させてみましたが、変数として展開されることはありませんでした。
    ruby_first さんの指摘は、今回の件とは関係ないです。

    http://php.net/manual/ja/language.types.string.php#language.types.string.parsing

    キャンセル

  • 2017/12/31 22:32

    http://php.net/manual/ja/language.variables.basics.php
    > 変数名は、PHPの他のラベルと同じルールに従います。 有効な変数名は文字またはアンダースコアから始まり、任意の数の文字、 数字、アンダースコアが続きます。

    とあり、今回は、変数名として適切ではないため、展開しようとしなかったようですね。

    $2suaojffhdsc から 2 を抜くと、ちゃんと変数として展開しようとします。というか、Undefined variable が出るだけですけど。

    キャンセル

  • 2017/12/31 23:18

    失礼しました。
    出力自体はできておりました。
    「<」はHTML上で特殊文字にあたるので変換が必要です。
    「<」は「&lt;」に置き換えるとただの文字としての「<」になりますので

    $random_words = array(
    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
    'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
    'vmaoZxIG&lt;MMDj0ggY$2suaojffhdsc',
    'cccccccccccccccccccccccccccccc',
    'dddddddddddddddddddddddddddddd'
    );

    とするとすべて出力されます。
    htmlspecialchars( )はHTMLやJavascriptとして意味のある文字をただの文字に変換してくれるので
    同じように「<」を「$lt;」に変えています。

    キャンセル

  • 2018/01/01 05:38

    私のコメント、読み直してみると、ruby_first さんに向けていっているように見えますね^^;質問者に向けて言ったつもりでした。。。
    失礼しました。

    質問したんだったら、ちゃんと回答を理解して、BA付けなきゃダメよって意図でコメントしました。

    $ を含む、文字列を扱う時に、シングルクォーテーションを使いましょうというのは、まっとうな指摘だと思います。

    キャンセル

+1

ブラウザ上で表示させるのであれば、エスケープしてください。

echo htmlspecialchars( $random_words[$i], ENT_QUOTES, 'UTF-8' );

【htmlspecialchars関数やhtmlentities関数で使用されるフラグの検証 - Qiita】
https://qiita.com/mpyw/items/939c526dd5de6619b565#%E3%81%BE%E3%81%A8%E3%82%81

【【PHP入門講座】 XSS攻撃への対策 - Qiita】
https://qiita.com/mpyw/items/565b3670dd0c7f9162fa#%E5%AF%BE%E7%AD%96%E6%96%B9%E6%B3%95

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ブラウザに出力した内容が意図したとおりにならないってことですよね?
出力はちゃんとされていると思います。
ソース見てみてください。

追記
私の回答で理解できないか、誤解した人がいるようなので補足します。

php としての出力は、正しくvmaoZxIG<MMDj0ggY$2suaojffhdscとされています。
これはブラウザでソースを表示することで、確認がとれます。

問題は、出力した内容のブラウザの解釈ですが、HTML として特殊な意味を持つ文字列が含まれるため、意図したものになりません。

これを回避するには、特殊文字を HTML エンティティに変換することが一般的です。
htmlspecialchars

普通は上記マニュアルを参照することをオススメするのですが、htmlspecialchars に関しては、使い方によって問題を起こすケースがあるので、kei344 さんの紹介するリンク先を参照するのが良いです。
リンク先はちょっと難しいことも書いてあるので、理解できないうちは「まとめ」部分を利用するだけになるかもしれません。が、重要なので、ちゃんと理解できるまで、何度も読み返すことをオススメします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    18649questions

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