• ベストアンサー

str_replace()で、なぜ置き換わらないのでしょうか?

下記でエスケープのtestをしていますが、何故か& の置換えが出来ず、「abc & def」としか表示されません。 <?php $memo="abc & def"; $memo=str_replace('&','&amp',$memo); echo $memo; ?> 幼稚な質問で恐縮ですが、どこが不具合の原因か教えて頂けるとありがたいです。

  • PHP
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

HTML出力時のエスケープが目的ならそれで合ってます。エスケープされたソースを、ブラウザが、元の文字に戻して表示します。 ただ、その目的であれば、自分で独自に処理せずに、htmlspecialchars関数を使います。 http://www.php.net/manual/ja/function.htmlspecialchars.php サンプルは、↓ ENT_QUOTES と 文字コード名を省略せず指定してください。 $memo = htmlspecialchars($memo,ENT_QUOTES,"UTF-8");

spindle
質問者

お礼

ありがとうございました。 htmlspecialchars関数のレファレンスも良く読んでみます。

その他の回答 (2)

回答No.3

>それで合ってます。 http://www.w3.org/TR/REC-xml/#sec-references セミコロン… # 本当は「DOMでやれ」って言いたい。すごく言いたい。 # .NETのDOMの実装がーorz

spindle
質問者

お礼

DOM・・・・ 調べてみたいと思います。貴重なご示唆をありがとうございました。

  • kyo999
  • ベストアンサー率64% (34/53)
回答No.1

「abc & def」と表示されるのはブラウザ上ですか? ソースだと「 abc &amp def 」となっていませんか? &amp は & のHTMLエンティティなのでブラウザ上では「 & 」と表示されます。 ブラウザ上で「 abc &amp def 」と表示させたいなら以下のように。 $memo=str_replace('&','&amp;amp',$memo);

spindle
質問者

補足

ご回答ありがとうございます。 >「abc & def」と表示されるのはブラウザ上ですか? はい、そうです。 >ソースだと「 abc &amp def 」となっていませんか? 表示-ソースで確認したら「 abc &amp def 」となっていましたが、 ブラウザ上の表示が「&」でも これでフォームから書き込まれた「&」がエスケープできているのでしょうか?  「<」や「>」もエスケープしたいのでtestしているのですが、少し心配です。心配無用? すみません、少し追補をお願いします。

関連するQ&A

  • str_replaceで文字化け

    お世話になります。 PHPでstr_replaceを使用しましたら、 「ー」や「・」などの文字が、文字化けを してしまいました。 いろいろ調べたのですが、よく分からずに 困っています。 PHPで文字の置換を行いながら、文字化けを しない方法はどのようにしたらよいのでしょうか。 $abc = str_replace(" ", "", $abc); のあとに$abcを出力しましたら、文字化けをして しまいました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • エスケープ文字にstr_replaceが効かない

    フォームで送信された文字列のうち、str_replace関数を使って半角記号を全角記号に置換したいのですが、一部のエスケープ文字が含まれている文字列の置換が上手くいきません。 ソースは以下に記しますが、現状では、"(ダブルクォート)は\&quot;、&(半角アンド)は&amp;と置換されてしまいます。 この場合であれば、”(全角ダブルクォート),&(全角アンド)と出力させたいのですが・・・ どなたかお気づきの点ありましたらご教示宜しくお願いします! ===============ソースコード================================= <?php $system = ""; if (isset($_POST["submit"])) { $system = htmlspecialchars($_POST["system"], ENT_QUOTES); $system = mb_convert_encoding($system, "EUC-JP", "SJIS"); $system = str_replace('&', '&', $system); $system = str_replace('"', '”', $system); $system = str_replace('あ', '”', $system); $_SESSION["system"] = $system; } $str = <<<STRING <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <form method="post" action="{$SERVER['PHP_SELF']}" enctype="multipart/form-data" > <textarea name="system" cols=40 rows=5 wrap=soft>{$system}</textarea> <input type="submit" name="submit" value="送信"> </form> ----------------------------------------------------------<br> {$_SESSION["system"]} </body> </html> STRING; $str = mb_convert_encoding($str, "SJIS", "EUC-JP"); echo $str; ?> ============================================================ ちなみに、『あ』→『”(全角ダブルクォート)』と、正しく置換されます。

    • ベストアンサー
    • PHP
  • ランダム(不規則)な文字列の置換えについて

    初めて投稿させていただきます。 文字列置換について、色々と調べたのですが全く解決しなかったのでこの場を借りてご質問させて頂きます。 早速ですが記述から記載させて頂きます。 $str = file_get_contents('http://example.com/'); $replaced = str_replace("index.php?ref=123abc", "index.php?ref=456def", $str); echo $replaced; このように一定の文字列に対しては置換ができたのですが、 index.php?ref=123abc の箇所が index.php?ref=123abc&PHPSESSID=qazwsxedcrfvtgbyhnujmikolpqazwsx のようにPHPSESSIDのセッションID(毎回変わるランダムな32桁の文字列)が付いてきた場合に index.php?ref=456def に置換える方法がわかりません。 &PHPSESSIDの文字列の先頭部分から右に43文字目※(&PHPSESSID=の所で11文字)+(IDの所で32文字)※までを index.php?ref=456def に置き換える方法や 初めからPHPSESSIDのセッションIDの部分を表示させない方法など ここ数週間色々考えてみましたがどうしてもわかりませんでした。 PHP初心者ですので、なるべくわかりやすく教えて頂けると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Replaceメソッド 完全一致で置換したい

    VBAのReplaceメソッドを完全一致で使う方法はありますか? Excel.Range.Replaceメソッドの方ではなく、 VBA.Strings.Replaceメソッドの方なのですが、 Sub test12() MsgBox Replace("abc", "ab", "") '・・・(1) MsgBox Replace("ab", "ab", "") '・・・(2) End Sub (1)の場合は、置換対象と置換前文字が一致しないから、置換されたくなくて、 (2)の場合は、置換対象と置換前文字が一致する(完全一致)から、置換される・・・ とやりたいのですが、可能でしょうか? Excel.Range.Replaceメソッドなら、LookAt:=xlPartなどで、条件をつけられますが、 VBA.Strings.Replaceの場合、どうすればいいですか?

  • PHPのエスケープシーケンスについての質問です。

    PHPのエスケープシーケンスについての質問です。 下記のコードで改行コードを<br>に置換し、結果を画面に出力しました。 $text = "あいうえお\\nかきくけこ\nさしすせそ"; $text = str_replace("\n", "<br>" , $text); echo $text; 実行結果は下記になりました。 あいうえお\\nかきくけこ さしすせそ 私の予想では、\\nが\<br>に置換され、下記になるかと思いました。 あいうえお\ かきくけこ さしすせそ なぜ\\nは\<br>に置換されず、そのままだったのでしょうか?

    • ベストアンサー
    • PHP
  • ヌルバイト攻撃の対策について

    ヌルバイト攻撃の対策について教えて下さい。 一般的な"\0"を削除する方法なのですが、以下の場合ですと問題無ありません。が、 $arr = "abc\0def"; if (mb_strpos($arr, "\0")) { $arr = str_replace("\0", "", $arr); } echo $arr; ※結果:abcdef POST送信された値には、全く反応しません。 $arr = $_POST["arr"];//送信データは"abc\0def" if (mb_strpos($arr, "\0")) { $arr = str_replace("\0", "", $arr); } echo $arr; ※結果:abc\0def スクリプトコードはUTF-8で、magic_quotes_gpcはOffです。 他にどこをチェックすればよいかわからず投稿しました。 チェックすべきところを教えていただけないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • preg_replace()でマッチ文字列に関数を

    PHPでのpreg_replace()でマッチした文字列に関数を適用したいのですが、上手くいきません。 $str = "hogeHoge"; $pattern = '/(h.ge)/i'; $replacement = strtoupper("$1"); echo preg_replace($pattern, $replacement, $str); // 期待する結果 : HOGEHOGE // 実行した結果 : hogeHoge 根本的に間違っているかもしれませんが、ご指南いただければ幸いです。

    • ベストアンサー
    • PHP
  • Java -- Ant replaceタスク 予約記号の置換 エスケープ方法

    Java -- Ant replaceタスク 予約記号の置換 エスケープ方法 Ant1.7を利用しているのですが、つまずいてます。ご存知の方教えて下さい。 replaceタスクを使って、”<include path="test.xml" /> ”の文字列を空白に置換(削除)したいのですが "<" , """ の記号が予約文字でantのエラーになってしまいます。 どの様にエスケープして実現可能でしょうか? ヨロシクお願いします。 <replace file="${base.dir}/conf/appl.xml" token="<include path="test.xml" />" value=""/>

  • 【PHP】preg_replace() で正規表現が正常に動かない?

    PHP5利用者です。 preg_replace() が思い通りに動かないため困っています。 マルチバイト文字及び正規表現を使おうとした場合動作がおかしいのです。例えば、 「 . 」は任意の1文字とされていますが、 $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); 等と書いても何も置換されません。 これは一体どういうことなのでしょうか? 文字コードはUTF-8です。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • str_replaceとpreg_replace

    phpで、汎用環境で文字化けしそうな文字を,ad hoc に機種依存しない文字に置換する過程に関して質問させて頂きます。 例えば(株)を(株)に、置換等です。 宜しくお願いいたします。 こちらのページのコードで、 http://memo.xight.org/2006-06-19-13 もともと、以下のようなコードサンプルA(推測)が、 -----▼サンプルA $arr=array('\xE3\x8A\x91' => '(株)',………); foreach ($arr as $key => $val) {  $str_rep = preg_replace("/$key/", $val, $str_rep); } -----▲ こちらの方の指摘で、 http://blog.poyo.jp/archives.php/categ-1/year-2006/month-6/id-1150817399 -----▼サンプルB $arr=array('\xE3\x8A\x91' => '(株)',………); return str_replace( array_keys( $arr), array_values( $arr), $str); -----▲ コードサンプルBに、変更(改善?)されたようです。一見、なるほどと思うのですが、実際にサーバ上で試したところコードサンプルAは問題なく機能しますが、コードサンプルBは機能しません。(特殊文字にマッチしない) 私の環境の問題で機能しないだけなのか、サンプルBを提示していた方の早まりなのか、判断がつかずに困っています。 ただし、'\xE3\x8A\x91'のようなユニコード文字列を、(株)といった文字に打ち変えて実行すると、きちんと認識して、置換が行われます。 str_replaceとpreg_replaceの機能の違いによるものだと思ったのですが、今回、このコードを利用し、80,000件位のコメントに置換をかけようとしているため、少しでも早く軽く置換できる方法を探しております。 見た目的にはループで走査していくよりも、str_replaceでスパっと置換した方が早そうに感じるので、できるならばサンプルBのような書き方で置換する様をベンチマークしたいと考えております。 なぜ、コードサンプルBが機能しないのか、また、正常に機能させるためには何が必要なのか、アドバイス・ご教示頂けましたら幸いです。 ちなみにコードサンプルAの元は、以下かと思いますが、こちらはまったく問題なく機能することが確認できています。 http://www.happytrap.jp/blogs/2009/09/11/1393/

    • ベストアンサー
    • PHP

専門家に質問してみよう