- ベストアンサー
preg_replaceを使って特定の文字を削除したいと思っています。
preg_replaceを使って特定の文字を削除したいと思っています。 具体的には $name = "青木太郎(男)"; の(男)の部分を取り除いて $name = "青木太郎"; にしたいのですが正規表現が分からないためうまくいきません。 preg_replace("/(*)/", "", $name); などとしてみたのですがエラーになってしまいます。 括弧から括弧までの文字を丸ごと削除するにはどのようにしたらいいでしょうか。 文字コードはUTF-8です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
preg_replaceをsjis前提で行うと精度がおちますね utfのままででやりましょう <? $name ="青木太郎 (男) "; mb_internal_encoding('UTF-8'); echo $name."<br>\n"; $pattern="/[ ]*\(.*?\)[ ]*/u"; $name =preg_replace($pattern,"",$name); print $name; ?>
その他の回答 (3)
- godcase
- ベストアンサー率33% (4/12)
半角なら \(.*\)
お礼
お陰さまで無事できました。 ありがとうございました。
補足
すいません。ご指摘のとおり、半角でした・・・ 正確には $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)
まずここでいう括弧は全角文字で間違いないでしょうか? そのうえで、パターン"/(*)/"というのは0個以上の「(」+「)」 という意味で、男にあたるものがしめせていません。 最短マッチもふくめるとこんな感じでやるとよいでしょう。 <? $name = "青木太郎(男)井上花子(女)"; $pattern="/(.*?)/"; $name =preg_replace($pattern,"",$name); print $name; ?>
お礼
お陰さまで無事できました。 ありがとうございました。
補足
すいません。懸念されていた通り、半角でした・・・ 正確には $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)
エラーにはならないと思います エラーと結果が思ったとおりにならないのは違うので使い分けましょう またエラーの場合はエラーメッセージも書くようにしましょう ご質問の件ですが preg_replace("/(.*)/", "", $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から取得したデータもまったく同じだと思うのですが何が原因なのでしょうか。
お礼
こちらのミスでした。 ちゃんと表示することができました。 長いことお付き合いくださいまして本当にありがとうございました。
補足
度々ありがとうございます。助かります。 アドバイス通り試してみたのですが、出力されたのは 青木太郎 (男) になってしまいました。 xmlを取得してpreg_replaceしているphpファイル自体がSHIFT_JISだったので ファイルのエンコードもUTF-8にしてみましたが 青木太郎 (男) と出力されてしまいました。 こうなるとxmlで取得したデータが何かおかしいと考えるべきでしょうか。 画面上で見る限りは全く同じなのですが・・・