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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

2回答

1561閲覧

PHP エスケープ処理

ryusan_012

総合スコア59

PHP

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

0グッド

0クリップ

投稿2018/06/29 06:14

編集2018/06/29 07:17

前に投稿していたPHPのプログラムで一つだけうまく出力できないのがありました。

input.php

1<!DOCTYPE html> 2<html lang="ja"> 3 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>入力</title> 7 </head> 8 9 <body> 10 <h2>入力画面</h2> 11 12 <form method="post" action="chara_result.php"> 13 <table> 14 <tr> 15 <td valign="top">文</td> 16 <td><textarea name="change"></textarea></td> 17 </tr> 18 <tr> 19 <td>変更文字列</td> 20 <td><input type="text" name="change_before" value="" /></td> 21 </tr> 22 <tr> 23 <td>変更後文字列</td> 24 <td><input type="text" name="change_after" value="" /></td> 25 </tr> 26 </table> 27 <input type="submit" name="check" value="変更" /> 28 </form> 29 </body> 30</html>

result.php

1<?php 2 if (isset($_POST["change"])) { 3 $write = $_POST["change"]; 4 $write_before = $_POST["change_before"]; 5 $write_after = $_POST["change_after"]; 6 7 //CRLFを改行1文字にする 8 $write = str_replace("\r\n", "\n", $write); 9 10 //未入力チェック 11 if (($write == "")||($write_before == "")||($write_after == "")) { 12 $result = "入力してください。"; 13 //文入力数チェック 14 } elseif (mb_strlen($write, 'utf-8') > 100) { 15 $result = "100文字以内で入力してください。"; 16 //変更後入力数チェック 17 } elseif (mb_strlen($write_before, 'utf-8') > 100) { 18 $result = "100文字以内で入力してください。"; 19 //変更後入力数チェック 20 } elseif (mb_strlen($write_after, 'utf-8') > 100) { 21 $result = "100文字以内で入力してください。"; 22 } else { 23 $write_change = htmlspecialchars($write_after, ENT_QUOTES, "UTF-8"); 24 //置換後文字列の色を変える 25 $write_after = "<span style='color: #ff0000'>$write_change</span>"; 26 //文字列置換 27 $result = htmlspecialchars(str_replace($write_before, $write_after, $write), ENT_QUOTES, "UTF-8"); 28 $result = str_replace(htmlspecialchars($write_after, ENT_QUOTES, "UTF-8"), $write_after, $result); 29 } 30 } else { 31 $result = "入力していません。"; 32 } 33?> 34<!DOCTYPE html> 35<html> 36 <head> 37 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 38 <title>結果</title> 39 </head> 40 <body> 41 <h2>結果画面</h2> 42 <table> 43 <tr> 44 <td valign="top">結果</td> 45 <td valign="top"> 46 <?php 47 echo nl2br($result); 48 ?> 49 </td> 50 </tr> 51 </table> 52 <a href="chara_input_test02.php">入力画面へ</a> 53 </body> 54</html>

上の二つのPHPで入力フォームに
<span style='color: #ff0000'>tt</span>
aaaa
変換前文字列に「aa」変換後文字列に「t」といれると<span></span>の文字列が赤文字で「t」だけ出力されます。
他の出力は大丈夫でしたがこれだけです。
解決方法ってありますか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/29 06:24

提示されたコードの実行結果と、質問文に書かれている現象に食い違いがあります。
ryusan_012

2018/06/29 06:31

質問文を少し修正しました
退会済みユーザー

退会済みユーザー

2018/06/29 06:34 編集

質問文に書いたものをそのまま実行して見てください。質問文の内容と全然結果が異なります。ちゃんと確かめて!全角スペースとか混ざってるし…
m.ts10806

2018/06/29 07:20

html5で廃止された要素が使われているので、記述を揃えてください。 例:tdのvalign
guest

回答2

0

ベストアンサー

とりあえず、自分好みのものに書き直した。

php

1<!DOCTYPE html> 2<html lang="ja"> 3 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>入力</title> 7 </head> 8 9 <body> 10 <h2>入力画面</h2> 11 12 <form method="post" action="chara_result.php"> 13 <table> 14 <tr> 15 <td></td> 16 <td><textarea name="change"></textarea></td> 17 </tr> 18 <tr> 19 <td>変更文字列</td> 20 <td><input type="text" name="change_before" value="" /></td> 21 </tr> 22 <tr> 23 <td>変更後文字列</td> 24 <td><input type="text" name="change_after" value="" /></td> 25 </tr> 26 </table> 27 <input type="submit" name="check" value="変更" /> 28 </form> 29 </body> 30</html>

php

1<?php 2if (filter_input(INPUT_POST, 'check')) { 3 $write = filter_input(INPUT_POST, 'change'); 4 $write_before = filter_input(INPUT_POST, 'change_before'); 5 $write_after = filter_input(INPUT_POST, 'change_after'); 6 7 //CRLFを改行1文字にする 8 $write = str_replace("\r\n", "\n", $write); 9 10 //未入力チェック 11 if (($write == "") || ($write_before == "") || ($write_after == "")) { 12 $result = "入力してください。"; 13 //文入力数チェック 14 } elseif (mb_strlen($write, 'utf-8') > 100) { 15 $result = "100文字以内で入力してください。"; 16 //変更後入力数チェック 17 } elseif (mb_strlen($write_before, 'utf-8') > 100) { 18 $result = "100文字以内で入力してください。"; 19 //変更後入力数チェック 20 } elseif (mb_strlen($write_after, 'utf-8') > 100) { 21 $result = "100文字以内で入力してください。"; 22 } else { 23 $write_change = htmlspecialchars($write_after, ENT_QUOTES, "UTF-8"); 24 //置換後文字列の色を変える 25 $write_after = "{*$write_change*}"; 26 //文字列置換 27 $result = str_replace($write_before, $write_after, $write); 28 $result = str_replace($write_after, $write_after, $result); 29 } 30} else { 31 $result = "入力していません。"; 32} 33?> 34<!DOCTYPE html> 35<html> 36 <head> 37 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 38 <title>結果</title> 39 <style type="text/css"> 40 .red { 41 color: red; 42 } 43 </style> 44 </head> 45 <body> 46 <h2>結果画面</h2> 47 <table> 48 <tr> 49 <td valign="top">結果</td> 50 <td valign="top"> 51 <?php 52 echo nl2br(preg_replace('/\{*(.*)*\}/', '<span class="red">$1</span>', htmlspecialchars($result, ENT_QUOTES, 'utf-8'))); 53 ?> 54 </td> 55 </tr> 56 </table> 57 <a href="chara_input.php">入力画面へ</a> 58 </body> 59</html>

投稿2018/06/29 07:17

編集2018/06/29 07:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$write_resultを表示している箇所がないですよ?

--

$writelって変数がおかしい。

$write_afterに対してhtmlspecialchars()適用したのが$write_changeで、
それの前後に<span>加えたものが$write_afterで、
「,aaaa」に相当する部分が無いと思うのだが。

htmlspecialchars()の二度がけ? str_replace()の二度がけ? もおかしいでしょ。

まずは君たちが落ち着け。

投稿2018/06/29 06:23

編集2018/06/29 06:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryusan_012

2018/06/29 06:25

すみません、修正しました
退会済みユーザー

退会済みユーザー

2018/06/29 06:27

それでも質問文にある現象が発生している、と?
ryusan_012

2018/06/29 06:30

そうですね、質問文を少し修正したのですがやはり思っていたものと出力されたものが違いますね。
退会済みユーザー

退会済みユーザー

2018/06/29 06:38

if (isset($_POST["change"])) { って書いているけど、対応する要素もないから、処理されない
退会済みユーザー

退会済みユーザー

2018/06/29 07:03

それは <textarea name="change"> にテキストが入っていれば、おそらく、たぶん。 なんていうか、デバッグ中に原因がわからず袋小路に入ってそのままの状態を示されて「あとはよろしく」って言われているみたいに感じて、ちょっと気分悪いっす。
ryusan_012

2018/06/29 07:04

>Kousuke_Shibuya アドレスを直接指定して開くとissetないとエラーになりますよ >m6u 可読性が悪いのですがエスケープとstr_replaceの二度掛けで文字列を置換し、置換後文字列の色を変えてる処理になります
退会済みユーザー

退会済みユーザー

2018/06/29 07:05

あ、そっちか。submit の name はただ、つけているだけ?笑
退会済みユーザー

退会済みユーザー

2018/06/29 07:19 編集

デバッグをしやすくするために、加工前と加工後で同じ変数名を使い回すのをやめて、 この変数にはこういう状態のものが入っているはず、というのを都度var_dump()で確認すれば、 少しは前進するかと思います。 少なくとも、htmlspecialchars()加工後は表示用に変わってしまうため、分けるべきで、 さらにはhtmlspecialchars()をかけたあとはもう文字列連結以外の加工はしない、とするべきかと。 でないと、そのうちデータベースやデータファイルにデータ格納するときに、 表示用に加工したデータをうっかり格納してしまうことも起こりえます。
m.ts10806

2018/06/29 07:22

エラーは要約するのではなくそのまま、質問本文に提示してください。 https://teratail.com/help/question-tips#questionTips3-4-2 > 表示されたエラーメッセージをそのままコピー&ペーストしましょう。自分でタイプしなおしたり、自分で解釈・要約しようとしてはいけません。 大事な部分が抜け落ちたり情報が違うものになってしまう可能性があるからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問