• ベストアンサー

preg_replace, ereg_replace

$bodyにはテキストファイルなどから読み込んだ、$dateと言う文字(変数ではない)と、改行を含む文字列。 それで、「$date」を、phpスクリプト上の$dateの値に置換したく、 $tmp = preg_replace("/\$date/s", $date, $body); または、 $tmp = ereg_replace("\$date",$date,$body); としたのですが、どうも置換されません。何がいけないのでしょうか?

  • arcsin
  • お礼率46% (194/417)
  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

>$が行末記号でないようにするために、頭に「\」を >付けたのですが、なぜここで\$としたのにもかかわ >らず、行末記号として認識されてしまったのでしょ >うか・・・ 「$date」はPHPの変数を意味します。その扱いはダブルクォート内部でも同じです。 従ってダブルクォート内部では「\$date」ではじめて文字列としての「$date」になります。 このままでは#1に書いた通り「行末」を意味しますので「文字」としての「$」とするために「\\」を更に付加します。 結果「"\\\$date"」という記述になります。 ダブルクォートを使用せずにシングルクォートを使用すると「'\$date'」とそのまま書けたりします。

arcsin
質問者

お礼

なるほど、丁寧にご解説してくださりありがとうございました~

その他の回答 (1)

  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

外していたら申し訳ないです。 正規表現で「$」って行末(?)を意味します。 って事でこのままでは行末に続くdateという文字列を探しているのではないでしょうか? $tmp = preg_replace("/\\\$date/s", $date, $body); $tmp = ereg_replace("\\\$date",$date,$body); では駄目ですか? # No-Testなので駄目かもしれませんが、、、m(_ _)m

arcsin
質問者

お礼

ありがとございます♪ ご指摘どおり、記述してみたところできました。 ですが、perl記述に慣れているため、疑問が残ってしまいます。 $が行末記号でないようにするために、頭に「\」を付けたのですが、なぜここで\$としたのにもかかわらず、行末記号として認識されてしまったのでしょうか・・・(perlだとこれで出来るのですが・・・) phpだと正規表現中の \$date は何を意味するのでしょうか。

関連するQ&A

  • ereg_replaceの文字化けについて

    宜しくお願いします。 PHPで文字列の置き換えをする関数の『ereg_replace』についてですが、この関数を使う変数に『'』がはいると、置き換え後にその『'』の前に『\』が付いちゃうんですが、これを回避する方法は無いでしょうか?ちなみに、文字化けするソースを明記させて頂きます。 $title_edit = ereg_replace("/\x0D\x0A|\x0D|\x0A/","<br>","${title}"); 入力フォームでtextareaで入力された項目が$titleに入るのですが、textarea内でエンター改行した場合に、その改行コードをHTML上の<BR>タグに置き換えるというものなんですが、これを行うと、『'』の前に『\』が入ってしまうのです。原因が良く判らないで困っています。 お願いします!教えて下さい!!

    • ベストアンサー
    • PHP
  • preg_match・ereg_replaceの動作について

    preg_matchとereg_matchの動作について調べています。 下記のスクリプトを実行すると、$stringが「代入テスト」となります。 ------------------------------------------- $v_insert = "代入" $string = "{%v_insert}テスト"; while (preg_match("/\{%(.*)\}/U", $string, $match)){ $string = ereg_replace($match[0], $$match[1], $a_subject); } ------------------------------------------- $$match[1]→$($match[1])→$(v_insert)となり、 $match[0]→/\{%(.*)\}/U $match[1]→v_insert $$match[1]→代入 となるのは分かったんですが、なぜ、$match[0]→/\{%(.*)\}/Uで$match[1]がv_insertになるのかが分かりません。 このスクリプトはどのように動き、どのように変数に値が設定されているのでしょうか。

    • ベストアンサー
    • PHP
  • phpのpreg_replaceで質問です

    お世話になります phpのpreg_replaceで質問です 下記の様な記述にて文字列の置換をしています $body = preg_replace("/cid:(\d{2,})@(\d{6}).(\d{6})/","/bl/id/$1/",$text); コレを改良してcidの次に入る値で処理を分けたいのですが、うまくいきません。 どなたかご教授お願い致します $arr = array("gif","jpg"."png"); $body = preg_replace("/cid:(\d{2,})@(\d{6}).(\d{6})/","/bl/id/$1/$arr[$1]",$text); 宜しくお願い致します

    • ベストアンサー
    • PHP
  • 【PHP】ereg_replace() にて置換の実行有無の確認方法は?

    PHP(Ver5)について質問です。 ereg_replace() 等の置換関数は実際に置換したか(マッチしたか)否かの応答はないのでしょうか? 現状、置換前文字列と置換後を比較して確認しているのですが、なんだか原始的のような気がして… 効率的な方法がありましたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • preg_replaceでの正規表現について

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 【PHP】preg_replace() で正規表現が正常に動かない?

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

    • ベストアンサー
    • PHP
  • ヒットする初回のみ置換する方法

    あいうえおかきくけこあいうえおあいうえお という文字列があった時、 初回の「あいうえお」のみ空に置換して かきくけこあいうえおあいうえお としたいのですが、str_replace()だと全部置換されてしまいますし、 preg_replace()やmb_ereg_replace()ではうまく置換されません。 対象とする文字列は、実際はHTMLタグやマルチバイトが混じっています。 置換するべき文字列は、全く同様のものが対象文字列内にも必ず含まれています。 preg_replace()やmb_ereg_replace()でも可能なのかもしれませんが、 どうやればいいのか分かりませんでした。 どなたかご教示下さい。

    • ベストアンサー
    • PHP
  • PHPのpreg_replaceについて

    文字列に半角、全角があったら''に置換したいです。 例)あ あ あ -> あああ 上記のように。 ソースは下記のとおりしてみたのですがうまく表示されませんでした。 $string = 'あ あ あ'; $pattern = '[ \t\n\r\f]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); 他には $string = 'あ あ あ'; $pattern = '[[:space:]]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); などと行ってみました。 ご教授お願いいたします。

    • 締切済み
    • PHP
  • preg_replaceで改行が含まれてしまう

    preg_replaceを使って置換をしようと思い、 $str = <<< END test test ;comment test END; $fstr = preg_replace("/;(.*$)/m", "<>;\\1<>", $str); echo $fstr; と言うようにやってみたのですが、置換した文字の後に改行が入ってしまいます どのようにすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • mb_ereg_replaceに関して

    こんにちは。お世話になっております。 開発時(PHP5.1.4)では何ら問題なかったものが、レンタルサーバー上(PHP5.0.4)へアップロードしたら、mb_ereg_replace関数の部分でエラーが出て対処に困っております。 エラー文 Call to undefined function mb_ereg_replace() $key = $_GET['key']; $key = addslashes($key); $key = mb_convert_encoding($key, 'EUC-JP', 'auto'); $key = mb_ereg_replace(" ", " ", $key);//ココでエラー $arr = explode(" ",$key); 上記は実際のソースの一部ですが、GETで渡された文字列(検索キーワード、key=○○)をDB(MySQL)に登録のあるデータを検索する。といった結果を願い設置しております。 借りたサーバ(共有)は、(適切な言葉じゃないかも知れませんが)PHPはCGIのもと動かしているようですが、これも原因の一つなのでしょうか? お忙しいなか恐縮ですが、ご指導のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP

専門家に質問してみよう