• ベストアンサー

preg_replaceを使って特定の文字を削除したいと思っています。

preg_replaceを使って特定の文字を削除したいと思っています。 具体的には $name = "青木太郎(男)"; の(男)の部分を取り除いて $name = "青木太郎"; にしたいのですが正規表現が分からないためうまくいきません。 preg_replace("/(*)/", "", $name); などとしてみたのですがエラーになってしまいます。 括弧から括弧までの文字を丸ごと削除するにはどのようにしたらいいでしょうか。 文字コードはUTF-8です。

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

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

preg_replaceをsjis前提で行うと精度がおちますね utfのままででやりましょう <? $name ="青木太郎 (男) "; mb_internal_encoding('UTF-8'); echo $name."<br>\n"; $pattern="/[ ]*\(.*?\)[ ]*/u"; $name =preg_replace($pattern,"",$name); print $name; ?>

ospsp
質問者

お礼

こちらのミスでした。 ちゃんと表示することができました。 長いことお付き合いくださいまして本当にありがとうございました。

ospsp
質問者

補足

度々ありがとうございます。助かります。 アドバイス通り試してみたのですが、出力されたのは 青木太郎 (男) になってしまいました。 xmlを取得してpreg_replaceしているphpファイル自体がSHIFT_JISだったので ファイルのエンコードもUTF-8にしてみましたが 青木太郎 (男) と出力されてしまいました。 こうなるとxmlで取得したデータが何かおかしいと考えるべきでしょうか。 画面上で見る限りは全く同じなのですが・・・

その他の回答 (3)

  • godcase
  • ベストアンサー率33% (4/12)
回答No.3

半角なら \(.*\)

ospsp
質問者

お礼

お陰さまで無事できました。 ありがとうございました。

ospsp
質問者

補足

すいません。ご指摘のとおり、半角でした・・・ 正確には $name ="青木太郎 (男) "; でした。 申し訳ありません。 みなさんの教えて頂いたとおりにしてみると確かにうまく括弧を取り除けたのですが、 $nameはxmlから取得したデータなのですが、そのデータだとうまくいきません。 試しに下記のようにしてみたところ、 $name = mb_convert_encoding($name, 'SJIS', 'UTF-8'); echo $name; echo '<br>'; $pattern="/\(.*?\)/"; $name1 = preg_replace($pattern,"",$name); $name1 = preg_replace('/^[  ]*(.*?)[  ]*$/', '$1', $name1); echo $name1; echo '<br>'; $name2 ="青木太郎 (男) "; echo $name2; echo '<br>'; $pattern="/\(.*?\)/"; $name3 =preg_replace($pattern,"",$name2); $name3 = preg_replace('/^[  ]*(.*?)[  ]*$/', '$1', $name3); echo $name3; echo '<br>'; 表示結果は 青木太郎 (男) 青木太郎 (男) 青木太郎 (男) 青木太郎 になりました。 xmlから取得したデータもまったく同じだと思うのですが何が原因なのでしょうか。

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

まずここでいう括弧は全角文字で間違いないでしょうか? そのうえで、パターン"/(*)/"というのは0個以上の「(」+「)」 という意味で、男にあたるものがしめせていません。 最短マッチもふくめるとこんな感じでやるとよいでしょう。 <? $name = "青木太郎(男)井上花子(女)"; $pattern="/(.*?)/"; $name =preg_replace($pattern,"",$name); print $name; ?>

ospsp
質問者

お礼

お陰さまで無事できました。 ありがとうございました。

ospsp
質問者

補足

すいません。懸念されていた通り、半角でした・・・ 正確には $name ="青木太郎 (男) "; でした。 申し訳ありません。 みなさんの教えて頂いたとおりにしてみると確かにうまく括弧を取り除けたのですが、 $nameはxmlから取得したデータなのですが、そのデータだとうまくいきません。 試しに下記のようにしてみたところ、 $name = mb_convert_encoding($name, 'SJIS', 'UTF-8'); echo $name; echo '<br>'; $pattern="/\(.*?\)/"; $name1 = preg_replace($pattern,"",$name); $name1 = preg_replace('/^[  ]*(.*?)[  ]*$/', '$1', $name1); echo $name1; echo '<br>'; $name2 ="青木太郎 (男) "; echo $name2; echo '<br>'; $pattern="/\(.*?\)/"; $name3 =preg_replace($pattern,"",$name2); $name3 = preg_replace('/^[  ]*(.*?)[  ]*$/', '$1', $name3); echo $name3; echo '<br>'; 表示結果は 青木太郎 (男) 青木太郎 (男) 青木太郎 (男) 青木太郎 になりました。 xmlから取得したデータもまったく同じだと思うのですが何が原因なのでしょうか。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

エラーにはならないと思います エラーと結果が思ったとおりにならないのは違うので使い分けましょう またエラーの場合はエラーメッセージも書くようにしましょう ご質問の件ですが preg_replace("/(.*)/", "", $name); ですね

ospsp
質問者

お礼

お陰さまで無事できました。 ありがとうございました。

ospsp
質問者

補足

おっしゃるとおりですね。申し訳ありません。 以後はエラーメッセージも忘れず記載致します。 また、他の問題も発生してしまったのでもし可能でしたらあわせて教えて頂けると助かります。 みなさんの教えて頂いたとおりにしてみると確かにうまく括弧を取り除けたのですが、 $nameはxmlから取得したデータなのですが、そのデータだとうまくいきません。 試しに下記のようにしてみたところ、 $name = mb_convert_encoding($name, 'SJIS', 'UTF-8'); echo $name; echo '<br>'; $pattern="/\(.*?\)/"; $name1 = preg_replace($pattern,"",$name); $name1 = preg_replace('/^[  ]*(.*?)[  ]*$/', '$1', $name1); echo $name1; echo '<br>'; $name2 ="青木太郎 (男) "; echo $name2; echo '<br>'; $pattern="/\(.*?\)/"; $name3 =preg_replace($pattern,"",$name2); $name3 = preg_replace('/^[  ]*(.*?)[  ]*$/', '$1', $name3); echo $name3; echo '<br>'; 表示結果は 青木太郎 (男) 青木太郎 (男) 青木太郎 (男) 青木太郎 になりました。 xmlから取得したデータもまったく同じだと思うのですが何が原因なのでしょうか。