• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列の置換の仕方について)

文字列の置換の仕方について

このQ&Aのポイント
  • 文字列の置換方法を知りたいです。特定のパターンに一致する文字列を他の文字列で置き換えたい場合、どのようにすればいいでしょうか?例えば、<code>$strString</code>という変数の中の特定の文字列を<code>$word</code>という文字列で置き換えたい場合、どのようにコードを書けばいいですか?
  • <code>$strString</code>という変数の中の文字列を置換する際に、<code>$strReplace</code>というパターンを使用します。ただし、常に同じパターンが現れるとは限らない場合があります。例えば、<code>&lt;!--s_1--&gt;</code>というパターンが常に現れるとは限らず、<code>&lt;!--s_2--&gt;</code>などの別のパターンも含まれる可能性があります。
  • 現在のコードでは、<code>$strReplace</code>と<code>$strString</code>の変数を使用して、<code>fun_replace</code>という関数を呼び出しています。しかし、まだ関数の中身は書かれていません。どのように組めば、指定したパターンの文字列を<code>$word</code>で置き換えることができるでしょうか?

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>「2011大特価」などのように数値が入っていると おお、すみません 考慮していませんでした。 $wordの先頭が数字だと "$1".$wordが$12011などのつながりになってしまうのでNGですね 対応策としては「"\${1}"」や「'${1}'」とするとよいようです。 $2の方は競合しないですが、念のため同じ書き方をおすすめします。 くわしくはマニュアル http://www.php.net/manual/ja/function.preg-replace.php のreplacementに関する注意書きの欄にあります。参照ください <?PHP $strString="abcd<!--s_1-->いろいろ<!--e_1-->efgyta<!--s_2-->うほほ<!--e_2-->zzzz<!--s_1-->うほほ<!--e_1-->xrti<!--s_3-->うほほ<!--e_3-->yrt"; $strReplace="/(<!--s_1-->).*?(<!--e_1-->)/"; $word="2011大特価"; preg_match($strReplace,$strString,$m); $result=fun_replace($strReplace,$strString,$word); print htmlspecialchars($result); function fun_replace($strReplace,$strString,$word){ $replacement='${1}'.$word.'${2}'; $strString=preg_replace($strReplace,$replacement,$strString); return $strString; } ?>

dv8hjkwf
質問者

お礼

ありがとうございました。おかげさまで助かりました。 参考URLを拝見して、奥の深さを感じているところです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

命題がいまいち明確でないので回答がぶれていますが ようは番号のついたところを全部かえちゃえばいいんじゃないの? <?PHP $strString="abcd<!--s_1-->うほほ<!--e_1-->efgyta<!--s_2-->うほほ<!--e_2-->zzzz<!--s_1-->うほほ<!--e_1-->xrti<!--s_3-->うほほ<!--e_3-->yrt"; $arrayReplace=array(1=>"大特価",3=>"2割引"); $result=fun_replace($arrayReplace,$strString); print htmlspecialchars($result); function fun_replace($arrayReplace,$strString){ foreach($arrayReplace as $key=>$val){ $pattern="/(<!--s_(".$key.")-->).*?(<!--e_\\2-->)/"; $replacement="$1".$val."$3"; $strString=preg_replace($pattern,$replacement,$strString); } return $strString; } ?>

dv8hjkwf
質問者

お礼

回答を参考にしながら、ほぼできるようになりました。 <?PHP $strString="abcd<!--s_1-->いろいろ<!--e_1-->efgyta<!--s_2-->うほほ<!--e_2-->zzzz<!--s_1-->うほほ<!--e_1-->xrti<!--s_3-->うほほ<!--e_3-->yrt"; $strReplace="/(<!--s_1-->).*?(<!--e_1-->)/"; $word="大特価"; $result=fun_replace($strReplace,$strString,$word); print htmlspecialchars($result); function fun_replace($strReplace,$strString,$word){ $replacement="$1".$word."$2"; $strString=preg_replace($strReplace,$replacement,$strString); return $strString; } ?> しかし、置換したい値(置換後に表示したい値)が、「2011大特価」などのように数値が入っていると、文字列の一部がなくなってしまいます。このあたりの調整で、つまづいています。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

こんな感じ <?PHP $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; $strReplace="/(<!--s_(\d)-->).*(<!--e_\\2-->)/"; $word="あいう"; $result=fun_replace($strReplace,$strString,$word); print htmlspecialchars($result); function fun_replace($strReplace,$strString,$word){ $replacement="$1".$word."$3"; return preg_replace($strReplace,$replacement,$strString); } ?>

dv8hjkwf
質問者

お礼

補足事項を追記しておきました。 回答では、<!--s_1-->うほほ<!--e_1--> が置換されましたが、文字列内に、<!--s_2--> などが出現すると、置換対象に含まれてしまうようです。 置換対象となる大元の文字列(ファイル内容) $strString 置換前の文字列 $strReplace 置換後の文字列 $word を引数として、置換後も、<!--s_1--> 等が残るような、書き方にしたいのです。

dv8hjkwf
質問者

補足

簡単に言ってしまえば、特定の文字列で挟まれた文字列を、その特定の文字列を残したまま、別の文字列に変換できないか? ということです。 例 <!--s_1-->本日発売<!--e_1--> → <!--s_1-->2割引<!--e_1--> 例えて言えば、 パン屋のホームページを作っているとして、商品を掲載しているページがあるとします。 商品Aは、「本日発売」、商品Bは「セール期間中」などなど、表示する位置は決まっていても、言葉がちがいます。 そして、「本日発売」であっても、夕方ごろには、「2割引」と表示しなおさないといけないわけです。つまり、同じ場所の語句を連続して、置換することもあるということです。 $strString="abcd<!--s_1-->うほほ<!--e_1-->efgyta<!--s_2-->うほほ<!--e_2-->xrti<!--s_3-->うほほ<!--e_3-->yrt"; というような、置換するべき位置情報がいくつも入っています。 <!--s_1-->~<!--e_1--> で挟まれている箇所を「大特価」にしよう、<!--s_3-->~<!--e_3--> で挟まれているところは、「2割引」に置換しよう…。 1回の処理で置換するのは、1箇所のみです。 どの場所の置換にも使えるような書き方にしたいところですが…。

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

修飾子eとかpreg_replace_callback()を使って、一致文字列から置換文字列をルックアップして置き換えるとか。 いっそのこと構文定義を明確にして、字句解析・構文解析器を記述したほうが手っ取り早いかもしれません。

参考URL:
http://www.ideone.com/xuK6e
dv8hjkwf
質問者

お礼

やり方はいろいろあると思うのですが、さて、正規表現を使ったほうがいいのか、それとも、文字列の何文字目から何文字目を切り出して…というような文字列関数を使うべきか、判断のつかないところなのです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2つの正規表現の違いは?

    次の正規表現を使った置換の違いがよく分かりません。 $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; echo preg_replace("/<!--s_1-->.*<!--e_1-->/","<!--s_1-->なんと<!--e_1-->",$strString); $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; echo preg_replace("/<!--s_1-->.*?<!--e_1-->/","<!--s_1-->なんと<!--e_1-->",$strString); .*  と .*? なんですが、どういったところで違いがでるのでしょうか?

    • 締切済み
    • PHP
  • 文字列の置換

    文字列の置換 たとえば, if(abcd) という文字列があったときに,これを while(abcd){ に置換するにはどうすればいいでしょうか(同じような置換をしたいところが文章中にいくつもあるとします).つまり,文字列の一部をそのままにして置換するということです.いまの場合だと if( → while( はできたとしても, ) → ){ は,文章中に“)”がたくさんある場合は難しいですよね.wordなら,ワイルドカードを使って if(*) とすれば,検索はできるのですが,そのまま置換すると while(*){ となってしまい,*がそのまま残ってしまいます.どうにかできないでしょうか?

  • ヒットする初回のみ置換する方法

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

    • ベストアンサー
    • PHP
  • 任意の文字列で囲まれていない任意の文字列を置換するには

    任意の文字列で囲まれていない任意の文字列を置換したいです。 たとえば、『 [[ 』と『 ]] 』で囲まれていない『http://hogehoge/』を『<a href="http://hogehoge/">http://hogehoge/</a>』に置き換えるにはどうすればいいのでしょうか。 具体的には下記の【置換前】のテキストを【置換後】のような感じにしたいです。 【置換前】 http://hogehoge/ [[http://hogehoge/]] http://hogehoge/ http://hogehoge/ [[http://hogehoge/]] 【置換後】 <a href="http://hogehoge/">http://hogehoge/</a> [[http://hogehoge/]] <a href="http://hogehoge/">http://hogehoge/</a> <a href="http://hogehoge/">http://hogehoge/</a> [[http://hogehoge/]] preg_replaceかereg_replaceのどちらかで例を挙げてもらえるとありがたいです。ご教示お願いします。

    • ベストアンサー
    • PHP
  • 文字列置換

    UNIXのコマンドで文字列の置換を試みています。 今回行いたい置換としては。。。 12年 1986年2月12日 14 などの文字列を NUM年 NUM年NUM月NUM日 NUM などに、連続した数字をひとまとめにNUMに置換したいと考えています。 文字列の置換方法としてsedコマンドがあると聞いてしらべてみたのですが、いまいいち理解することができませんでした。 自分で考えて試してみたコマンドが以下の通りです。 sed -e "s/\([1-9]\{1,2,3,4\}\)/NUM/g" filename が・・・まったく置換はされませんでした。 よろしければお教えください。よろしくお願いいたします。

  • 文字列置換

    PHPでの文字列置換についての質問です。 文字列を受け取った時には [09/06/04 21:01:05] といった値で受け取ります。これを [6月4日 21時1分] といった値で返そうと考えています。 str_replace、explodeでの方法も考えましたがあまりににくどい処理になるため、断念しました。 なにか他に手はないものでしょうか?? よろしければ回答お願いします。

    • 締切済み
    • PHP
  • 文字列の置換

    電話番号のデータを文字列分、'#'で置換したいのですが、 update test set tel_no = replace(tel_no,tel_no,'#'); では、'#'一文字になってしまいます。 電話番号が10桁の場合、##########と置換するための OracleのSQLを教えてください。

  • emacsで文字列の置換

    新しい職場で emacs を使い始めたのですが、文字列の置換をすると動作が変です。 ・abc → DEF という置換をすると、なぜか ・abc → DEFbc となってしまいます。 M-% M-x replace-string のどちらで置換しても同じです。 とても困っています!!どなたかアドバイスを!!!

  • 文字列の置換

    JAVAであるファイル内の文字列を置換するプログラム(日本語)を作りたいのですが、 ・ ・ String h_s; FileReader h_fr = new FileReader(in_filename); BufferedReader h_br = new BufferedReader(h_fr); while(true){  h_s = h_br.readLine();  if (h_s == null){   break;  }  ●文字列を置換するプログラム● } ・ ・ ここの●文字列を置換するプログラム●にあたる適当な関数って何かありますか? たとえばperlでいうと↓みたいなものなのですが・・・ s/置換前文字/置換後文字/g よろしくお願いします。

    • ベストアンサー
    • Java
  • 長い文字列の置換を出来るエディタを教えてください。

    数式Texのコマンドなんですが、1000文字の文字列を1500文字の文字列に置換しようとしたところ、255バイト以上のデータはきられてしまい、正常に置換できませんでした。 秀丸、Wordのソフトウェアや複数行置換のフリーウェアを探したのですが、正常に置換できませんでした。 このように1000文字を1500文字への置換等、長い文字列を置換できるソフトウェアがあれば教えてください。