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

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

ただいまの
回答率

88.13%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,696
退会済みユーザー

退会済みユーザー

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

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


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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • masaya_ohashi

    2017/02/22 11:51

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

    キャンセル

回答 4

+5

2点修正

  • エスケープコードをシングルクォーテーションでくくってはいけません。
    "\n"とするか、PHP_EOLを指定してください

  • 単に$valueに代入してももとの配列$post_dataには反映されません
    foreachでリファレンス渡し&$valueを利用してください

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 11:59

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

    キャンセル

  • 2017/02/22 12:02

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

    キャンセル

  • 2017/02/22 12: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";

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 11:01

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

    キャンセル

  • 2017/02/22 11:02

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

    キャンセル

  • 2017/02/22 11:38

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

    キャンセル

+2

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

$ cat test.php
<?php
$value='foo<br>var';
echo  var_dump(str_replace('<br>', '\n', $value));
echo  var_dump(str_replace('<br>', "\n", $value));
echo  var_dump(str_replace('<br>', PHP_EOL, $value));

$ php ./test.php
string(8) "foo\nvar"
string(7) "foo
var"
string(7) "foo
var"

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

-4

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 12:33 編集

    「エスケープされていた」とは具体的にどういう事だったのでしょうか?
    また、どのように解決されたのでしょうか?

    ヘルプを参照ください。「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>
    > [検査の項目]

    キャンセル

  • 2017/02/22 12:35

    上に同じです。

    キャンセル

  • 2017/02/22 13:05

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

    キャンセル

  • 2017/02/22 13:20

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

    キャンセル

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

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

関連した質問

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