• ベストアンサー

preg_replaceについて

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

noname#248070
noname#248070
  • PHP
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • 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
  • preg_replace ereg_replace

    いつもお世話になっております。 データを抽出する前にサニタイズが必要となり、 実行する処理で、 $rep = "/\\\/"; $arr = array('data1' => 'A', 'data2' => '\\\\\\'); $ret = preg_replace($rep , "\\\\\\" ,$arr ); $ret = ereg_replace("'", "\'" ,$ret); preg_replaceは配列で戻ってくる事は知っているのですが、 ereg_replaceは配列で戻ってくるのでしょうか。 お手数ですが、宜しくお願い致します。

    • ベストアンサー
    • 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
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • preg_replaceの正規表現を教えて下さい。

    preg_replaceの正規表現を教えて下さい。 元:'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ' 後:'あいうえお<meta content=\"text/html; charset=utf-8" />かきくけこ' というように、charset= に続く部分を preg_replaceで置換したいのですが、スキル不足でできません。 $a = 'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ'; $p = "/<meta.*charset=([^\"']+)[^>]/i"; $x = preg_replace( $p, "utf-8", $a ); とやってみましたが、$xには、全く期待通りの結果は得られませんでした。 この置換を実現できる正規表現を教えて下さい。

    • ベストアンサー
    • PHP
  • 連想配列からpreg_replaceで効率よく

    下記のような処理って結構、効率悪い書き方かなと思っていますが、連想配列としてstr_replaceするにはどのようにすればよいのでしょうか? また、同じような関数で strtr > str_replace > preg_replace の順で処理が早いようなサイトを見ましたが、皆さんはどれを使っていますか?お勧めな方法やアドバイスを下さい。 $moji01 = "<リンゴ>"; $moji02 = "<バナナ>"; $moji03 = "<イチゴ>"; $moji04 = "<メロン>"; $moji05 = "<スイカ>"; 一部処理は省略してます。 $html = file_get_contents($temp); $html = str_replace( "<りんご>", $moji01, $html); $html = str_replace( "<ばなな>", $moji02, $html); $html = str_replace( "<いちご>", $moji03, $html); $html = str_replace( "<めろん>", $moji04, $html); $html = str_replace( "<すいか>", $moji05, $html); echo "$html";

    • 締切済み
    • PHP
  • preg_replaceにおけるeオプション

    文字列$strは、「aa:bb」という文字列を含み、$flagが1のときは、この部分を「aa」に。0のときは「bb」に置き換えるという処理で、 $str = preg_replace("/(.*):(.*)/e","($flag) ? $1 : $2", $str); とするも、うまくできません。 http://www.jp.u4ia.net/~tkyng/php/php_manual_i18n/function.preg-replace.html こちらのサイトの一番下にe修飾の使い方がのっているのですが、これを真似てもうまくいきません。 e修飾の使い方を教えてください。

    • ベストアンサー
    • PHP
  • preg_replaceでタグだけ置換

    HTMLのタグを別のタグに置換しようとしています。 HTML中に複数ある<a></a>タグ <a href="/w/index.php?title=%E3%83%95%E3%82%B0%E3%83%AA%E3%83%BC%E5%B7%9D&amp;action=edit" class="new" title="フグリー川">フグリー川</a>など という文字列の<a></a>タグを<span style="color:#ff0000;"></span>に置換したいのです。 $pattern = '|<a href="/w/index\.php\?title=.*?">(.*)</a>|'; $replace = '<span style="color:#ff0000 ;">\\1</span>'; preg_replace( $pattern, $replace, $html, -1, $count); print $count; $countの表示は 1 でした。上記のような<a>タグは複数あるのに。 上記のような<a>タグをマッチさせるにはどうパターン表記したらいいでしょうか? PHP5.2.4です。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • preg_replaceでの警告

    PHP5.2.4を使用しています。 CakePHPというフレームワークの中の関数で、次のような Warning (2): preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 6 という警告がでるのですが、preg_replace関数の第4引数を指定してないからなのかな?と思い、 1という数字を指定してみたりしたのですが、同じような警告が出てしまいます・・・ たぶんバージョン間の違いだと思いますが、 この場合は、たとえば警告を出さないフラグを変更する以外に preg_replace関数をどのように記述すれば良いのでしょうか? function slug($string, $replacement = '_') { if(!class_exists('String')) { require_once LIBS . 'string.php'; } $map = array( '/a|a|a|a/' => 'a', '/e|e|e|?|e/' => 'e', '/i|i|i/' => 'i', '/o|o|o|o/' => 'o', '/u|u|?|u/' => 'u', '/c/' => 'c', '/n/' => 'n', '/a|a/' => 'ae', '/o/' => 'oe', '/u/' => 'ue', '/A/' => 'Ae', '/U/' => 'Ue', '/O/' => 'Oe', '/s/' => 'ss', '/[^\w\s]/' => ' ', '/\\s+/' => $replacement, String::insert('/^[:replacement]+|[:replacement]+$/', array('replacement' => preg_quote($replacement, '/'))) => '', ); /* print "string=$string<br>\n"; print_r(array_keys($map)); print_r(array_values($map)); */ $string = preg_replace(array_keys($map), array_values($map), $string); return $string; } string=test<br> Array ( [0] => /a|a|a|a/ [1] => /e|e|e|?|e/ [2] => /i|i|i/ [3] => /o|o|o|o/ [4] => /u|u|?|u/ [5] => /c/ [6] => /n/ [7] => /a|a/ [8] => /o/ [9] => /u/ [10] => /A/ [11] => /U/ [12] => /O/ [13] => /s/ [14] => /[^\w\s]/ [15] => /\s+/ [16] => /^[_]+|[_]+$/ ) Array ( [0] => a [1] => e [2] => i [3] => o [4] => u [5] => c [6] => n [7] => ae [8] => oe [9] => ue [10] => Ae [11] => Ue [12] => Oe [13] => ss [14] => [15] => _ [16] => )

    • 締切済み
    • PHP
  • PHP正規表現の難題・preg_replaceでイメージタグをリンクタグに…

    PHPのpreg_replaceを使用して、 imgタグをaタグに置換するプログラムで躓いています。 全てのパターン$hogeで適用される正規表現をかけません。 (※現在パターン1のみ出来ない状況で困っています) 間違い箇所ありましたらご教授下さい。 ■パターン1 $hoge = '<img src="http://test.jp/test.gif" class="test" style="border:none;" />'; ■パターン2 $hoge = '<img src="http://test.jp/test.gif">'; ■パターン3 $hoge = '<img width="100" src="http://test.jp/test.gif">'; preg_replace('/\<img(.*)src=\"?(http[\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(jpg|jpeg|gif|png|bmp))\"(.*)\>/i',"<a href='\\2'>link</a>",$hoge); どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP