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

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

ただいまの
回答率

88.05%

textareaで送信したデータを改行させたくない。

受付中

回答 1

投稿 編集

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

score -6

test1.php

<html>
<head>
<meta charset="utf-8">
<title>test.php</title>
</head>
<body>
<form action="test2.php" method="post">
<table border="1">
<tr>
<td>1</td>
<td><textarea name='name1' rows='12' placeholder='入力して下さい。'></textarea></td>
<td>2</td>
<td><textarea name='name2' rows='12' placeholder='入力して下さい。'></textarea></td>
<td>3</td>
<td><textarea name='name3' rows='12' placeholder='入力して下さい。'></textarea></td>
<td>4</td>
<td><textarea name='name4' rows='12' placeholder='入力して下さい。'></textarea></td>
<td>5</td>
<td><textarea name='name5' rows='12' placeholder='入力して下さい。'></textarea></td>
<td>6</td>
<td><textarea name='name6' rows='12' placeholder='入力して下さい。'></textarea></td>
<input type="submit" value="入力">
</td>
</tr>
</table>
</form>

</body>
</html>

test2.php
<html>
<head>
<meta charset="utf-8">
<title>test2.php</title>
</head>
<body>
<?php

  $name1 = str_replace('PHP_EOL|<br />|\r\n|\r|\n',"to",$_POST['name1']);
  $name2 = str_replace('PHP_EOL|<br />|\r\n|\r|\n',"to",$_POST['name2']);
  $name3 = $_POST['name3'];
  $name4 = str_replace("PHP_EOL|<br />|\r\n|\r|\n","to",$_POST['name4']);

  $name31 = str_replace("PHP_EOL|<br />|\r\n|\r|\n","to",$name3);

  $name5 = str_replace(PHP_EOL,"<br />",$text);
  $name6 = str_replace(["\n","\n\r","\r"],"<br />",$text);

print ("1.$name1<br />");
print ("2.$name2<br />");
print ("31.$name31<br />");
print ("4.$name4<br />");
print ("5.$name31<br />");
print ("6.$name4<br />");

file_put_contents("logtest.txt",$name1."+".$name2."+".$name3."+".$name4.
"+".$name5."+".$name6."+".PHP_EOL,FILE_APPEND) 


?>

</body>
</html>

logtest.txt
(各フォームに
asd
123
bnm
と打った結果)
テキストを開いて見ると、
asd
123
asg+asd
123
asg+asd
123
asg+asd
123
asg+
asd
123
bnm+asd
123
bnm+asd
123
bnm+asd
123
bnm+++

となり、改行されてしまいます、toもどこにも書かれていません。これを、
asd123asg+asd123asg+asd123asg+asd123asg+asd123bnm+asd123bnm+asd123bnm+asd123bnm
とか
asd123asg</br>asd123asg</br>asd123asg</br>asd123asg</br>asd123bnm・・・
とかいうふうに一行に記録させたいのですが、どうすればよいのでしょうか。

やはり設定上できないものなんでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2020/04/11 13:53 編集

    実際のコードをご提示ください。

    キャンセル

  • k130

    2020/04/11 18:17 編集

    書きました。

    キャンセル

  • m.ts10806

    2020/04/11 19:57

    質問は編集できますので。

    キャンセル

  • k130

    2020/04/12 20:28

    書きました、他に何か必要でしょうか。

    キャンセル

回答 1

0

改行コードを単純にstr_replaceされては。

<?php
$text = <<<EOF
aaa
123
46

EOF;

//定数
echo str_replace(PHP_EOL,"<br />",$text);
//または
echo str_replace(["\n","\n\r","\r"],"<br />",$text);

ただ、データを加工して保存するということはあまり良くないことです(本来は出力時にXSS対策をするので)。
できれば保存先はテキストではなくDBにされたほうが良いでしょう(用途分からないですけど)

追記:
中々ちゃんと質問のコードが調整されないので同じこと何回も言うのもあれなので何も反応しなかったんですけど、こちらも時間ができたので、追記します。

HTML構文おかしいところがあるので、そこは直すとして(submitボタンがtdの中になってない)

    <form method="post">
        <table border="1">
            <tr>
                <td>
                    1
                </td>
                <td>
                    <textarea name='name1' rows='12' placeholder='入力して下さい。'></textarea>
                </td>
                <td>
                    2
                </td>
                <td>
                    <textarea name='name2' rows='12' placeholder='入力して下さい。'></textarea>
                </td>
                <td>
                    <input type="submit" value="入力">
                </td>
            </tr>
        </table>
    </form>


簡略化した上記のHTMLで試してみました。
というか、何か新しい機能を試す場合、最小構成で試しましょう。
本来だとtableタグも不要かと思います。
※action属性を除きましたが、最小構成にすべく「自身」に送信するようにしました

コード全文

<?php
if($_SERVER['REQUEST_METHOD']==='POST'){
    var_dump($_POST); //送信内容確認

    $contents = '';//コンテンツ保管用変数
    //置換
    $contents = 'name1 PHP_EOL:'.str_replace(PHP_EOL,"<br />",$_POST['name1']).PHP_EOL;
    $contents .= 'name1 改行コード:'.str_replace(["\n","\n\r","\r"],"<br />",$_POST['name1']).PHP_EOL;
    $contents .= 'name2 PHP_EOL:'.str_replace(PHP_EOL,"<br />",$_POST['name2']).PHP_EOL;
    $contents .= 'name2 改行コード:'.str_replace(["\n","\n\r","\r"],"<br />",$_POST['name2']).PHP_EOL;

    //補完
    file_put_contents('test.txt',$contents);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>test.php</title>
</head>
<body>
    <form action="" method="post">
        <table border="1">
            <tr>
                <td>
                    1
                </td>
                <td>
                    <textarea name='name1' rows='12' placeholder='入力して下さい。'></textarea>
                </td>
                <td>
                    2
                </td>
                <td>
                    <textarea name='name2' rows='12' placeholder='入力して下さい。'></textarea>
                </td>
                <td>
                    <input type="submit" value="入力">
                </td>
            </tr>
        </table>
    </form>

</body>
</html>


入力(Firefox)
イメージ説明

送信後
イメージ説明

text.txtの内容

name1 PHP_EOL:asd<br />123<br />bnm
name1 改行コード:asd<br /><br />123<br /><br />bnm
name2 PHP_EOL:asd<br />123<br />bnm
name2 改行コード:asd<br /><br />123<br /><br />bnm

私が提示した2案、いずれも変換されてます。
「改行コード」とした方は<br />が2つ入ってるので厳密には要件に添えていませんが、
「改行コードの置換」は成功しています。
ただ、PHP_EOLで十分と言うのもこれで分かると思います。

普段Firefoxを主としているのでFirefoxで先に確認しましたが、GoogleChromeでも結果は同じでした。

「toにならない」と仰っていますが、str_replace()はその名の通り指定した文字列を別の文字列に変換する機能ですので、正規表現は使えないんじゃないかなと。
それに、'PHP_EOL|<br />|\r\n|\r|\n'ダブルクォート内では\は役目を果たしませんし、PHP_EOLは定義済みの定数なのでこちらもクォートで囲った時点で「PHP_EOLという文字列」になり、その役目を果たしていません。

つまり、「置換が機能している」と言えるのはご自身のコードだと下記2点のみだと思います。

  $name5 = str_replace(PHP_EOL,"<br />",$text);
  $name6 = str_replace(["\n","\n\r","\r"],"<br />",$text);


ですがこの2点も誤りがあります。
$textという変数、どこで定義されていますか?
本来は$_POSTname5name6からそれぞれ取得しなければならないのでは?

プログラムは書いたようにしか動きませんので、「定義したものを正確に参照できているか」は確実にしましょう。
変数名も手打ちじゃなくコピペが間違いありません。
(str_replace()の結果を $name31 という名前の変数で受け取っていながら、file_put_contents() に使っている変数が $name3 という$_POSTそのままの値を受け取った変数になっているところとか)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/04/12 21:46

    マークダウンでコードを追記してください。
    https://teratail.com/questions/238564

    キャンセル

  • 2020/04/13 15:28 編集

    自分ももう一度試しにやってみたのですが、
    自分ももう1度やってみたのですが、
    $name1 = str_replace(["\n","\n\r","\r"],"<br />",$_POST['name1']);
    とすると改行確かにできました、しかしなぜか</ br>が2つつきました。

    更に、PHP_EOLに変えると、改行された後</ br>がつきました。

    <br>は確かいくつついても機能は同じなので気にはならないですが、なぜ2つ・・・。

    キャンセル

  • 2020/04/13 17:15

    あのできれば、投稿前にプレビュー確認してもらえたら。
    はみ出しまくっていて、読みづらさが増してしまっています。

    キャンセル

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

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

関連した質問

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