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

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

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

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

Q&A

解決済

4回答

9438閲覧

PHPで文字列の<br>を\nに変換

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2017/02/22 01:53

編集2017/02/22 02:13

タイトルの通り、文字列内の特定のhtmlタグを変換したいです。

php

1 2 foreach($post_data as $key=>$value){ 3 $value = str_replace('<br>', '\n', $value); 4 }

このようにしましたが、変換されません。
どうすれば良いでしょうか?
よろしくお願いいたします。

ループの外でご指摘頂いた点を直して見たところ、変換されましたが、これをループの中でやると変換されません。

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

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

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

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

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

masaya_ohashi

2017/02/22 02:51

>ループの外でご指摘頂いた点を直して見たところ、変換されましたが、これをループの中でやると変換されません。 これ、具体的にどこをどう直した、どう試したのですか?
guest

回答4

0

2点修正

  • エスケープコードをシングルクォーテーションでくくってはいけません。

"\n"とするか、PHP_EOLを指定してください

  • 単に$valueに代入してももとの配列$post_dataには反映されません

foreachでリファレンス渡し&$valueを利用してください

PHP

1$post_data=["aaabbb","aaa<br>bbb"]; 2foreach($post_data as $key=>&$value){ 3 $value = str_replace("<br>", "\n", $value); 4} 5print_r($post_data);

投稿2017/02/22 02:04

yambejp

総合スコア114843

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

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

masaya_ohashi

2017/02/22 02:08

あー、これの後者の指摘っぽいですね。$post_dataの中の値は変わらないですからね。
退会済みユーザー

退会済みユーザー

2017/02/22 02:41 編集

このやり方でもやってみましたが、変わらず。。。 postで受け取った文字列は何か普通の文字列とは違うのでしょうか? ためしにstrposなどで<br>があるか確かめたのですが、判定では<br>がないことになってしまいます。 post_dateを見で見たらちゃんと<br>があるのに。。。
yambejp

2017/02/22 02:46

> post_dateを見で見たらちゃんと<br>があるのに。。。 というのであれば簡単なsampleでいいので var_dumpで例示してもらうのが早いのでは? postで受け取ろうがなんだろうが文字列は文字列です
masaya_ohashi

2017/02/22 02:47

変わっていない、という判断はどこでされていますか?提示されているコードは変換処理だけで、それを「使っている場所」がわからないので、もしかしたら「変換はされているけど、いざ表示するときに参照しているデータが間違っている」ということもあります。質問文に「表示している部分」のコードも足してみてはいかがでしょうか? 書いていてふと思いましたが、こんなことになっていますか? $post_data = $_POST; //あれこれ echo $_POST;
yambejp

2017/02/22 02:48

あやしいのは質問者さんが「<br>」と思っているものが実は 「&lt;br&gt;」だったり「<br />」だったりしませんか?
退会済みユーザー

退会済みユーザー

2017/02/22 02:56

string(629) "[氏名] テスト [フリガナ] テスト [御社名] テスト [メールアドレス] hoshi@dimsite.jp [電話番号] 00000000000 [郵便番号] 000-0000 [住所] 札幌市中央区 [資料の種別] その他<br>川水<br> [採集者] 御社<br> [採取予定日] 2017/00/00 [検査の項目] 51項目 飲用井戸等給水開始前等の検査項目<br> [検査の項目] var_dumpするとこの通り、<br>が残ったままです。 この出力結果を見て判断しています
退会済みユーザー

退会済みユーザー

2017/02/22 03:00 編集

該当部分のコードは以下です。 また、<br>はエスケープした後に確認画面での表示を整えるために付け足したものですので <br>自体はエスケープされてません //送信内容初期化 $contents = ''; //メールテンプレート読み込み $mail_str = file_get_contents(dirname(__FILE__).'/tpl/mail.txt'); $reply_str = file_get_contents(dirname(__FILE__).'/tpl/reply.txt'); //ポストデータ分解 foreach($post_data as $key=>&$value){ if($key == 'mode'){ continue; } if(strpos($key, '-re') !== false){ continue; } $value = str_replace("<br>", "\n", $value); $contents .= '['.$form_detail[$key]["label"].'] '.str_replace("<br>", "\n", $value)."\r\n"; } var_dump($contents);
yambejp

2017/02/22 02:59

var_dumpして「<br>」が可視化できるのであればそれは きっと「&lt;br&gt;」なんだと思いますが・・・ 表示後ブラウザでソース表示してみてください
moonphase

2017/02/22 03:02

横から失礼します。 実際のコードを改めて載せて見ては如何でしょうか。
moonphase

2017/02/22 03:08

$value = str_replace("<br>", "\n", $value); したあとに再度str_replace("<br>", "\n", $value)してますね。これは無駄では? 発生している問題とは関係ないですが・・・ $value = str_replace("<br>", "\n", $value); $contents .= '['.$form_detail[$key]["label"].'] '.$value."\r\n";
guest

0

'\n'とSingleQuoteで囲むとエスケープ文字として認識されません。
"\n"とするかPHP_EOL (php.net)PHP_EOLを使用ください。

bash

1$ cat test.php 2<?php 3$value='foo<br>var'; 4echo var_dump(str_replace('<br>', '\n', $value)); 5echo var_dump(str_replace('<br>', "\n", $value)); 6echo var_dump(str_replace('<br>', PHP_EOL, $value)); 7 8$ php ./test.php 9string(8) "foo\nvar" 10string(7) "foo 11var" 12string(7) "foo 13var"

投稿2017/02/22 02:04

Y.H.

総合スコア7914

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

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

0

もし<br>が改行ではなく「\n」という文字列に変わってしまう、という意味でしたら、\nを囲むクォーテーションをダブルクォーテーションに変えましょう。シングルクォーテーション内の\nは改行コードではなく、そのまんま\nという文字として扱われます。

投稿2017/02/22 01:59

masaya_ohashi

総合スコア9206

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

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

退会済みユーザー

退会済みユーザー

2017/02/22 02:01

""にしても変換そのものができませんでした。
masaya_ohashi

2017/02/22 02:02

var_dumpなどで$post_data、$key、$valueの中身を確かめてください。本当に意図したとおりの値が入っていますか?
退会済みユーザー

退会済みユーザー

2017/02/22 02:38

確かめましたが、確かに<br>が入っていて、これを変換したいのです。
guest

0

ベストアンサー

エスケープされていました(汗)
ご協力頂いた皆さん、本当にありがとうございます!

投稿2017/02/22 03:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Y.H.

2017/02/22 03:42 編集

「エスケープされていた」とは具体的にどういう事だったのでしょうか? また、どのように解決されたのでしょうか? ヘルプを参照ください。「4-2. どのように解決したのかを伝えましょう」 https://teratail.com/help/question-tips#questionTips4-2 > string(629) "[氏名] テスト > [フリガナ] テスト > [御社名] テスト > [メールアドレス] hoshi@dimsite.jp > [電話番号] 00000000000 > [郵便番号] 000-0000 > [住所] 札幌市中央区 > [資料の種別] その他<br>川水<br> > [採集者] 御社<br> > [採取予定日] 2017/00/00 > [検査の項目] 51項目 飲用井戸等給水開始前等の検査項目<br> > [検査の項目]
moonphase

2017/02/22 03:35

上に同じです。
退会済みユーザー

退会済みユーザー

2017/02/22 04:05

<br>がhtmlspesialcharsでエスケープされて&lt;br&gt;になっていました。 出力結果をchromeの開発ツールで見ていたのでそれに気付きませんでした。 (開発ツールではエスケープされた文字列も<br>として出力されます) 右クリックのページのソースを表示でコードを見ると、エスケープされて上記のようになっているのがわかりました。 であれば、&lt;br&gt;を置換すればいいんだなとわかり、結果 $value = str_replace("&lt;br&gt;", "\n", $value); とすることで解決しました。 不明な点があればコメントお願いします。
Y.H.

2017/02/22 04:20

yambejpさんの指摘通りhtmlエンコードされてた(エスケープではなく)んですね。 回答本文に記載いただけたらと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問