• ベストアンサー

エスケープ文字そのものにマッチさせる正規表現

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

  • Tinte
  • お礼率40% (40/98)
  • PHP
  • 回答数3
  • ありがとう数1

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

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

状況がよくつかめないのですが、str_replaceでリプレースできない のであればそれはもはや「\」ではなく別のなにかなのでは? ダンプリストをとってみるとわかりやすいかもしれません。 <? $value="aa\\bb\\\\cc\ndd"; print $value."<br>".getDump($value)."<br>"; $value = str_replace('\\','',$value); print $value."<br>".getDump($value)."<br>"; function getDump($str){ $str2=''; for($i=0;$i< strlen($str);$i++){ if($str2!="") $str2.=" "; $str2.=bin2hex(substr($str,$i,1)); } return $str2; } ?>

Tinte
質問者

補足

 大変ありがとうございます!  yambejpさんのデバックコードで原因がわかりました。正に「もはや\ではない」ということでした。    現在Movable Typeのテンプレート中にphpコードを書いていたのですが、Movable Typeは比較的性能のいいCMSなのですが、どうしてだか\が?に自動的に変換されてしまうということを思い出しました。これが何を意味しているのかちょっと僕にもわからないのですが、ダンプした結果たぶんa5が?と\の両方で共通して出ていました。  以前から正規表現は考えるのが面倒なので今まで使ったものをコピペしていたので間違いはない筈なんですが、正にCMSのなんらかの自動的な変換が絡んでいたようです。  最終的な解決にはまだ至っていませんが、大変参考になりました。ありがとうございます。  この先はMovable Typeの方の問題なので、また調べなおしてみます。 ありがとうございました。

その他の回答 (2)

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

決め打ちで「\」だけはずすなら正規表現は使わない方がよいでしょう。 $value = str_replace('\\','',$value); ちなみにどうしても正規表現でおこなうなら、明示的にpreg_quote() するとわかりやすいかもしれませんね <? $value='aa\\bb\\\\cc\ndd'; //$value = str_replace('\\','',$value); $value = preg_replace('/'.preg_quote('\\').'/','',$value); print $value; ?> なお、変換元の文字コードがsjisの場合、5c問題がありますので ひと手間必要になります

Tinte
質問者

補足

早速の解答ありがとうございます。 これがなかなか難関で、yambejpさんが書いてくださったコードでもうまくいきませんでした。どうしても\だけ残ってしまうんです。セキュリティー上大した問題にはならないのですが、無駄な入力はできるだけ削除しておきたいな…という感じです。 サーバー上のphp.iniの何らかの設定の問題なのかな…とも思いいろいろと調べているところです。 文字コードはUTF-8なので5c問題は回避できているという状況です。 当初は面倒なので僕も決め打ちでstr_replaceでやってみたのですが、これもやはりダメでした。正規表現というこだわりは全くないのですが、\だけ残ってしまうという状況に悶々としております…。。。 理屈でいうとそもそも [][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=] この正規表現でいけると思うのですが…。。。

noname#77845
noname#77845
回答No.1

http://php.benscom.com/manual/ja/regexp.reference.php このサイトの中にある、バックスラッシュの囲み記事は参考になりますか?

Tinte
質問者

補足

解答ありがとうございます。 正規表現のエスケープは今までも何度か使ってきているのでド素人…という程でもないと自分で思っていたのですが、今回だけは何が原因なのか全くダメなんです。 マルチバイト系の関数でも試してみましたが、軒並みダメでした。。。

関連するQ&A

  • POSIX系(ereg)とPerl互換系(preg_match)、PHPの実務で多用されるのはどっち?

    PHPの実務の現場で、好んで使用される正規表現関数は、 POSIX互換かPerl互換かどちらでしょうか? 場合によりけりでしょうか? それとも、Perlを知らないプログラマーは、ereg や ereg_replace しか使っていなかったり、 逆に、機能が豊富な preg_match や preg_replace の方が好まれるのでしょうか? 今後、PHPプログラマーと共同で開発することを考えれば、どちらを使用すればいいでしょうか? ※POSIX互換では、数字の \d って使えないんですか?

    • ベストアンサー
    • PHP
  • 全角カタカナの正規表現

    if (preg_match('/[ァ-ヶー]+/', $value, $match )) { print ("$value"."はカタカナです。"."($match[0])"."<br />") } else { print ("$value"."はカタカナではない。<br />"); } という感じで全角カタカナにマッチさせる正規表現を使いたいのですが、このやり方だと「全角カタカナを含んでいる…」という表現になってしまいます。ある文字列が「すべて全角カタカナである」という正規表現を考えているのですが、なかなかうまくいきません。逆引きのサンプルなんかでもなかなか見つからなくて困っています。  同様に「すべて平仮名にマッチ!」というのにも応用できると思うのですが、なかなかうまく行きません。  是非、そのやり方やヒントをおしえてください。  マルチバイト対応なので[ぁ-ん]のような形で表記できます。またPerl互換(preg_match)で作っているので、Perlに詳しい方も是非是非おしえてください。

    • ベストアンサー
    • PHP
  • 文字列全体に対する置き換え [正規表現]

    正規表現での文字列全体に対する、マッチ箇所 への置き換えについて、アドバイスをもらえないでしょうか。 parlでいうg修飾子はphpには無く、 例えば、[preg_match]は[preg_match_all]という関数で対応出来ますが、 置き換えを行う[preg_replace]には[preg_replace_all]がありません。 それに類する関数も無いように思います。 これに関して、PHPではどのように対応すれば良いのでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現eregとpreg

    pregがperl互換の正規表現というのは分かったのですが、eregとpregは使い分ける用途などがあるのででしょうか? あるhtmlから<a herf="--">タグを抜く作業に苦労していまして、調べるとどちらも使われているようで、正規表現を勉強するのにも戸惑っています。 せひ宜しくお願いします。

    • ベストアンサー
    • PHP
  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • 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
  • PHP、正規表現の使い方

    PHPで特定の文字列から特定の文字までを削除したいのですが、 正規表現を使うということはわかりましたが、どのようにしていいかがいまいちわかりません。 http://www.sample.php?a=test&b=ex&c=sample という文字列があったとして、 &b=exを取り除きたい場合はどのようにしたらいいのでしょうか。 mb_ereg_matchを使用しようと思っていますが、 その他の方法があればそちらも教えてください。

    • ベストアンサー
    • PHP
  • 正規表現について

    正規表現を使用して文字列の置換(ereg_replace)をしたいと思うのですが、 うまくいかず悩んでおります。。 以下の文字列があったとします。 【AAA】【BBB】【CCC】DDD 文字列の中から先頭から始まる【】でくくられたものだけ(【AAA】)だけ削除して、 結果を【BBB】【CCC】DDDとしたいのですが、正規表現でどのようにヒットさせればよいのか分りません。 ※【】の中にくる文字はAAAとは限りません。 お手数ですがご教授頂けますでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現をエスケープさせる関数はあるのでしょうか?\はつけたくないです。

    =head Perlの正規表現で例えば aa+aaという文字列をマッチさせたいのですがわざわざ\をいれずに、正規表現をエスケープするような関数? $k = ○○($k); はあるのでしょうか? =cut #my $k = 'aa+aa'; # だとマッチせず my $k = 'aa\+aa'; # だとマッチします。 my $dat = 'aa-aa+aa-aa'; if($dat =~ /($k)/){ print "見つかりました\n"; } print "OK\n"; exit; __END__

    • ベストアンサー
    • Perl
  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP