- ベストアンサー
文字列の置換の仕方について
- 文字列の置換方法を知りたいです。特定のパターンに一致する文字列を他の文字列で置き換えたい場合、どのようにすればいいでしょうか?例えば、<code>$strString</code>という変数の中の特定の文字列を<code>$word</code>という文字列で置き換えたい場合、どのようにコードを書けばいいですか?
- <code>$strString</code>という変数の中の文字列を置換する際に、<code>$strReplace</code>というパターンを使用します。ただし、常に同じパターンが現れるとは限らない場合があります。例えば、<code><!--s_1--></code>というパターンが常に現れるとは限らず、<code><!--s_2--></code>などの別のパターンも含まれる可能性があります。
- 現在のコードでは、<code>$strReplace</code>と<code>$strString</code>の変数を使用して、<code>fun_replace</code>という関数を呼び出しています。しかし、まだ関数の中身は書かれていません。どのように組めば、指定したパターンの文字列を<code>$word</code>で置き換えることができるでしょうか?
- みんなの回答 (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; } ?>
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
命題がいまいち明確でないので回答がぶれていますが ようは番号のついたところを全部かえちゃえばいいんじゃないの? <?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; } ?>
お礼
回答を参考にしながら、ほぼできるようになりました。 <?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)
こんな感じ <?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); } ?>
お礼
補足事項を追記しておきました。 回答では、<!--s_1-->うほほ<!--e_1--> が置換されましたが、文字列内に、<!--s_2--> などが出現すると、置換対象に含まれてしまうようです。 置換対象となる大元の文字列(ファイル内容) $strString 置換前の文字列 $strReplace 置換後の文字列 $word を引数として、置換後も、<!--s_1--> 等が残るような、書き方にしたいのです。
補足
簡単に言ってしまえば、特定の文字列で挟まれた文字列を、その特定の文字列を残したまま、別の文字列に変換できないか? ということです。 例 <!--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)
修飾子eとかpreg_replace_callback()を使って、一致文字列から置換文字列をルックアップして置き換えるとか。 いっそのこと構文定義を明確にして、字句解析・構文解析器を記述したほうが手っ取り早いかもしれません。
- 参考URL:
- http://www.ideone.com/xuK6e
お礼
やり方はいろいろあると思うのですが、さて、正規表現を使ったほうがいいのか、それとも、文字列の何文字目から何文字目を切り出して…というような文字列関数を使うべきか、判断のつかないところなのです。
お礼
ありがとうございました。おかげさまで助かりました。 参考URLを拝見して、奥の深さを感じているところです。