• ベストアンサー

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から取得したデータもまったく同じだと思うのですが何が原因なのでしょうか。

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

関連する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の正規表現を教えて下さい。

    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
  • phpでpreg_replaceで次のような条件の文字を置換したいのですが…

    <a href="jump?url= *1 " target="_blank"> *2 </a> というAタグになっている文字列を *2 だけのテキストにしたいと思っています。 preg_replaceでの正規表現での条件がわかりません…。

    • ベストアンサー
    • PHP
  • preg_replaceで連続した改行

    preg_replaceで5回以上の連続した改行を1回の改行に直したいのですが、 正規表現はどのように書いたらいいのでしょうか? 書いてみたのですが、動いてくれません。。。 <? $str=preg_replace("/\n/{5,}","\n",$str); ?> 申し訳ありませんが、ご教授ください。

    • ベストアンサー
    • PHP
  • エスケープ文字そのものにマッチさせる正規表現

     お世話になっております。  PHPの正規表現でエスケープ文字\そのものにマッチさせる正規表現がなかなか作れません。Perl互換のpreg_replaceなども試してみましたがダメでした。エスケープ文字そのものを削除したいのですが、どうしたらよいでしょうか? $value = ereg_replace ('\\', '', $value);//ダメでした。 $value = preg_replace ('/\\/', '', $value);//同様にダメでした。 $value = preg_replace ('/[\\]/', '', $value);//同様にダメでした。  文字列中に\が入っていたり、単独で\があった場合は必要ないので削除するといった感じです。 $value = ereg_replace ('[][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=]', '', $value); これでいけるかと思ったのですが、\だけ残ってしまいます。最後辺りの\\で\文字それ自体にマッチするかと思うんですが…。 わかる方がいらしたらおしえてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • str_replaceとpreg_replace

    phpで、汎用環境で文字化けしそうな文字を,ad hoc に機種依存しない文字に置換する過程に関して質問させて頂きます。 例えば(株)を(株)に、置換等です。 宜しくお願いいたします。 こちらのページのコードで、 http://memo.xight.org/2006-06-19-13 もともと、以下のようなコードサンプルA(推測)が、 -----▼サンプルA $arr=array('\xE3\x8A\x91' => '(株)',………); foreach ($arr as $key => $val) {  $str_rep = preg_replace("/$key/", $val, $str_rep); } -----▲ こちらの方の指摘で、 http://blog.poyo.jp/archives.php/categ-1/year-2006/month-6/id-1150817399 -----▼サンプルB $arr=array('\xE3\x8A\x91' => '(株)',………); return str_replace( array_keys( $arr), array_values( $arr), $str); -----▲ コードサンプルBに、変更(改善?)されたようです。一見、なるほどと思うのですが、実際にサーバ上で試したところコードサンプルAは問題なく機能しますが、コードサンプルBは機能しません。(特殊文字にマッチしない) 私の環境の問題で機能しないだけなのか、サンプルBを提示していた方の早まりなのか、判断がつかずに困っています。 ただし、'\xE3\x8A\x91'のようなユニコード文字列を、(株)といった文字に打ち変えて実行すると、きちんと認識して、置換が行われます。 str_replaceとpreg_replaceの機能の違いによるものだと思ったのですが、今回、このコードを利用し、80,000件位のコメントに置換をかけようとしているため、少しでも早く軽く置換できる方法を探しております。 見た目的にはループで走査していくよりも、str_replaceでスパっと置換した方が早そうに感じるので、できるならばサンプルBのような書き方で置換する様をベンチマークしたいと考えております。 なぜ、コードサンプルBが機能しないのか、また、正常に機能させるためには何が必要なのか、アドバイス・ご教示頂けましたら幸いです。 ちなみにコードサンプルAの元は、以下かと思いますが、こちらはまったく問題なく機能することが確認できています。 http://www.happytrap.jp/blogs/2009/09/11/1393/

    • ベストアンサー
    • PHP
  • PHPでの文字列置換について

    こんにちは PHPにて丸カッコ内の文字列を取得しようとしています。 対象の文字列は、「坂(さか)」という文字列の全角丸カッコ「()」内になります。 正規表現でやればすぐに取得できるのかもしれませんが、正規表現の知識が無いため 力ずくでやってみようとしました。 そこで、「(」で文字列の位置を取得して…と考えて色々やったのですが、 この全角丸カッコ「(」が、mb_strposでも位置を検知できず、 全角丸カッコ「(」を半角にして対応してみようかとmb_ereg_replace('(','(','坂倉武史(さかくらたけし)');としようとしても、変換されず困っております。 ちなみに「坂(さか)」という文字列は、 ネット上のあるHTMLから、file_get_contentsでURLを指定してから 取得して、その文字コードがEUC-JPなので、 mb_convert_encoding($dataXML, "UTF-8", "EUC-JP"); で、UTF-8に変更しております。 文字コードの問題のかもしれませんが、答えがみつかりません。 1。正規表現で取得できるのであれば、正規表現の書き方をお教えいただけますでしょうか。 2。正規表現が難しいのであれば、力ずくでやるのでこの「(」全角丸カッコの始まりの検知方法をお教えいただけますでしょうか。 PHPの実行環境は、 PHP5.3 mbstring.language  japanese mbstring.internal_encoding  UTF-8 mbstring.encoding_translation  ON default_charset  UTF-8 UNIX 文字コード UTF-8 ソース文字コード UTF-8 です どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】preg_replace() で正規表現が正常に動かない?

    PHP5利用者です。 preg_replace() が思い通りに動かないため困っています。 マルチバイト文字及び正規表現を使おうとした場合動作がおかしいのです。例えば、 「 . 」は任意の1文字とされていますが、 $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); 等と書いても何も置換されません。 これは一体どういうことなのでしょうか? 文字コードはUTF-8です。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのpreg系正規表現が正しいかチェックる方法

    お世話になります PHPのpreg系正規表現で入力された値が 正規表現として正しいかどうか調べたいのですが どのようにすれば良いのでしょうか? 「正しい」とは 導き出したい値が正しいかではなく 正規表現の記述方法が正しいかどうかです 「[]」と「{}」が正しく閉じているかチェックするだけでいいのかな?? チェック用の関数などあったら最高です (例) 正しい [0-9]{1,3} 上記をpreg系関数に入れると1~3文字の半角数字という意味になります 誤っている [0-9{1,3} 上記をpreg系関数に入れると、括弧が閉じていないので Compilation failedになります お忙しい中恐縮ですが 分かる方お助け下さいませ

    • ベストアンサー
    • PHP
  • ある文字からある文字までの削除について

    現在ケータイサイト用に書いた文章をPCでも見れるようにしているのですが、 ケータイサイト用の絵文字コードが直接表示されてしまうため、preg_replaceで削除したいのですがパターンはどのように記述すればよろしいでしょうか? $str = "おはようございます[i:100]。こんにちは[i:101]。こんばんわ[i:102]。"; ↓ [ から ] までの文字を消し、 $str = "おはようございます。こんにちは。こんばんわ。"; と表示させたいのです…。 ご教授頂けたら幸いですm(_ _;)m よろしくお願いいたします。

    • ベストアンサー
    • PHP
MacBook AirからEP-805A印刷の方法
このQ&Aのポイント
  • MacBook AirからEP-805Aの印刷方法について教えてください
  • EP-805AのプリントスキャナーがMacBook Airで認識されない場合の対処方法を教えてください
  • EPSON EP-805AをMacBook Airに追加する方法を教えてください
回答を見る

専門家に質問してみよう