• ベストアンサー

preg_replaceについて

$text = "今日財布を拾った。"; $value = "100円"; $pattern = "/(今日).*(を拾った。)/"; $replace = sprintf("\\1%s\\2"); $text = preg_replace($pattern, $replace, $text); のような処理を行ったとき、 うまく$textに結果が格納されません。 $valueの最初の文字が数字で無い場合は うまくいきますが、"100円"のように数字で 始まっていると、うまくいきません。 良い回避方法は無いでしょうか?

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

  • ベストアンサー
  • okotaegoo
  • ベストアンサー率46% (6/13)
回答No.2

こんにちわ。 確かに常にスペースが入ってしまいます。(やっぱり指摘されちゃいましたか。←確信犯) ↓こんな方法ではどうでしょう?? $text = "今日財布を拾った。"; $val ="100円"; $value = (string) $val; $pattern = "/(今日).*(を拾った。)/"; $replace = sprintf("\\1 %2s\\2",$value); $text = preg_replace($pattern, $replace, $text); $array = explode(" ",$text); $text = $array[0].$array[1]; なんだか邪道のような気もするんですが、とりあえずうまくいきます。(例によって自信なし)

noname#248070
質問者

お礼

回答ありがとうございます。 $textにスペースが入っていなければ それでいいと思うのですが、 $textにスペースが入っているとだめですよね。 せっかく回答してもらって申し訳ないんですが。 一応、自分のやりたかったことは、 テキストファイル hoge = "foo" bar = "aaa" ~ END のfooの部分を置換したかったので $text = 「テキストファイルの中身」 $val = "999"; $pattern = "/(hoge = \").*?(\".*END)/ms"; $replace = sprintf("\\1%s\\2", $val); $text = preg_replace($pattern, $replace, $text); の$patternと$replaceを $pattern = "/(hoge = )\".*?\"(.*END)/ms"; $replace = sprintf("\\1\"%s\"\\2", $val); とすることで解決しました。

その他の回答 (1)

  • okotaegoo
  • ベストアンサー率46% (6/13)
回答No.1

こんばんわ。 ちょっと試してみました。 >$replace = sprintf("\\1%s\\2"); ここは$replace = sprintf("\\1 %s\\2");の様に\1と%sの間にスペースを1個入れてやるとうまくいくようです。 ところで、$replace = sprintf("\\1 %2s\\2",$value);の間違いでは??(PHP初心者なので全然自信なし)

noname#248070
質問者

補足

>$replace = sprintf("\\1%s\\2"); は、 $replace = sprintf("\\1%s\\2", $value); の間違いです。 たしかに、\\1と%sの間にスペースを入れれば うまくいきますが、出力される文章にも、 スペースが入っちゃうんですよね。。。

関連するQ&A

専門家に質問してみよう