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

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

ただいまの
回答率

90.34%

  • PHP

    21285questions

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

PHP エスケープ処理

解決済

回答 2

投稿 編集

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

ryusan_012

score 47

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

<!DOCTYPE html>
<html lang="ja">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>入力</title>
    </head>

    <body>
        <h2>入力画面</h2>

        <form method="post" action="chara_result.php">
            <table>
                <tr>
                    <td valign="top"></td>
                    <td><textarea name="change"></textarea></td>
                </tr>
                <tr>
                    <td>変更文字列</td>
                    <td><input type="text" name="change_before" value="" /></td>
                </tr>
                <tr>
                    <td>変更後文字列</td>
                    <td><input type="text" name="change_after" value="" /></td>
                </tr>
            </table>
            <input type="submit" name="check" value="変更" />
        </form>
    </body>
</html>
<?php
    if (isset($_POST["change"])) {
        $write = $_POST["change"];
        $write_before = $_POST["change_before"];
        $write_after = $_POST["change_after"];

        //CRLFを改行1文字にする
        $write = str_replace("\r\n", "\n", $write);

        //未入力チェック
        if (($write == "")||($write_before == "")||($write_after == "")) {
            $result = "入力してください。";
        //文入力数チェック
        } elseif (mb_strlen($write, 'utf-8') > 100) {
            $result = "100文字以内で入力してください。";
        //変更後入力数チェック
        } elseif (mb_strlen($write_before, 'utf-8') > 100) {
            $result = "100文字以内で入力してください。";
        //変更後入力数チェック
        } elseif (mb_strlen($write_after, 'utf-8') > 100) {
            $result = "100文字以内で入力してください。";
        } else {
            $write_change = htmlspecialchars($write_after, ENT_QUOTES, "UTF-8");
            //置換後文字列の色を変える
            $write_after = "<span style='color: #ff0000'>$write_change</span>";
            //文字列置換
            $result = htmlspecialchars(str_replace($write_before, $write_after, $write), ENT_QUOTES, "UTF-8");
            $result = str_replace(htmlspecialchars($write_after, ENT_QUOTES, "UTF-8"), $write_after, $result);
        }
    } else {
        $result = "入力していません。";
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>結果</title>
    </head>
    <body>
        <h2>結果画面</h2>    
        <table>
            <tr>
                <td valign="top">結果</td>
                <td valign="top">
                    <?php
                        echo nl2br($result);
                    ?>
                </td>
            </tr>
        </table>
    <a href="chara_input_test02.php">入力画面へ</a>
    </body>
</html>


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Kosuke_Shibuya

    2018/06/29 15:24

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

    キャンセル

  • ryusan_012

    2018/06/29 15:31

    質問文を少し修正しました

    キャンセル

  • Kosuke_Shibuya

    2018/06/29 15:32 編集

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

    キャンセル

  • mts10806

    2018/06/29 16:20

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

    キャンセル

回答 2

checkベストアンサー

+1

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

<!DOCTYPE html>
<html lang="ja">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>入力</title>
    </head>

    <body>
        <h2>入力画面</h2>

        <form method="post" action="chara_result.php">
            <table>
                <tr>
                    <td>文</td>
                    <td><textarea name="change"></textarea></td>
                </tr>
                <tr>
                    <td>変更文字列</td>
                    <td><input type="text" name="change_before" value="" /></td>
                </tr>
                <tr>
                    <td>変更後文字列</td>
                    <td><input type="text" name="change_after" value="" /></td>
                </tr>
            </table>
            <input type="submit" name="check" value="変更" />
        </form>
    </body>
</html>
<?php
if (filter_input(INPUT_POST, 'check')) {
    $write = filter_input(INPUT_POST, 'change');
    $write_before = filter_input(INPUT_POST, 'change_before');
    $write_after = filter_input(INPUT_POST, 'change_after');

    //CRLFを改行1文字にする
    $write = str_replace("\r\n", "\n", $write);

    //未入力チェック
    if (($write == "") || ($write_before == "") || ($write_after == "")) {
        $result = "入力してください。";
        //文入力数チェック
    } elseif (mb_strlen($write, 'utf-8') > 100) {
        $result = "100文字以内で入力してください。";
        //変更後入力数チェック
    } elseif (mb_strlen($write_before, 'utf-8') > 100) {
        $result = "100文字以内で入力してください。";
        //変更後入力数チェック
    } elseif (mb_strlen($write_after, 'utf-8') > 100) {
        $result = "100文字以内で入力してください。";
    } else {
        $write_change = htmlspecialchars($write_after, ENT_QUOTES, "UTF-8");
        //置換後文字列の色を変える
        $write_after = "{*$write_change*}";
        //文字列置換
        $result = str_replace($write_before, $write_after, $write);
        $result = str_replace($write_after, $write_after, $result);
    }
} else {
    $result = "入力していません。";
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>結果</title>
        <style type="text/css">
            .red {
                color: red;
            }
        </style>
    </head>
    <body>
        <h2>結果画面</h2>
        <table>
            <tr>
                <td valign="top">結果</td>
                <td valign="top">
                    <?php
                    echo nl2br(preg_replace('/\{\*(.*)\*\}/', '<span class="red">$1</span>', htmlspecialchars($result, ENT_QUOTES, 'utf-8')));
                    ?>
                </td>
            </tr>
        </table>
        <a href="chara_input.php">入力画面へ</a>
    </body>
</html>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

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

--

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/29 15:25

    すみません、修正しました

    キャンセル

  • 2018/06/29 15:27

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

    キャンセル

  • 2018/06/29 15:30

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

    キャンセル

  • 2018/06/29 15:38

    if (isset($_POST["change"])) {

    って書いているけど、対応する要素もないから、処理されない

    キャンセル

  • 2018/06/29 16:03

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

    キャンセル

  • 2018/06/29 16:04

    >Kousuke_Shibuya
    アドレスを直接指定して開くとissetないとエラーになりますよ

    >m6u
    可読性が悪いのですがエスケープとstr_replaceの二度掛けで文字列を置換し、置換後文字列の色を変えてる処理になります

    キャンセル

  • 2018/06/29 16:05

    あ、そっちか。submit の name はただ、つけているだけ?笑

    キャンセル

  • 2018/06/29 16:07

    そですねw

    キャンセル

  • 2018/06/29 16:19 編集

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

    でないと、そのうちデータベースやデータファイルにデータ格納するときに、
    表示用に加工したデータをうっかり格納してしまうことも起こりえます。

    キャンセル

  • 2018/06/29 16:22

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

    キャンセル

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

  • PHP

    21285questions

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