• ベストアンサー
  • すぐに回答を!

PHP 正規表現

はじめまして^^ 現在、PHPでプログラムを作っています。 そして、文字列の置き換えをする機会があり、 正規表現をつかうことになりました!! 置き換えに使う関数は、mb_ereg_replaceです! ある条件にあった部分の文字列を置き換えしたいと思っています。 そして、いろいろとやっていきましたら、あるひとつの壁にぶつかりました。。 例えば、PHPでは、正規表現の部分を [^文字]とやると、『文』と『字』という文字列以外にマッチという意味になるらしいのですが、 『文字』という文字列以外にマッチ、というふうに、表現したい場合は、 どう表現すればよいのですか? [^(文字)]とか、その他いろいろ、 自分なりに、色々ためしたのですが、うんともすんともいいません、、 どなたか、わかる方教えて下さいm(_ _)m

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数219
  • ありがとう数1

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

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

>『<br>> 文字<br>』マッチさせたいのです。 こんな感じでどうですか? 「<br>> 文字<br>」を「error」に変更しています (途中で改行してもよいです) <? $str=<<<eof test<br>> 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ<br>test test<br>> 改行から改行までマッチ。 途中にbrなんていうのがあってもマッチ<br>test eof; $str=preg_replace("/<br>>.*?<br>/mis","error",$str); print $str; ?>

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 正規表現について

    変数の文字列を範囲指定して削除しようとしています。 正規表現を使って範囲指定したいのですが、うまくいきません。 <span class="shimei"> ~ </span> というのは正規表現でどのように書くのでしょうか? $name = mb_ereg_replace("<span class=\"shimei\">.*</span>","",$name); これはどこが間違っているのでしょうか?

    • ベストアンサー
    • 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

その他の回答 (5)

  • 回答No.5

なに、俺だけシカトかいw > [^文]とやると、『文』以外にマッチしますよね。 > そして、二文字以上の文字以外にマッチさせたい場合は…どうやるんだ!! http://www.kt.rim.or.jp/~kbk/regex/regex.html#NOTINCLUDED > <br>> 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ<br> > 行頭に> つまり、<br>のあとに> があれば、 > 次に<br>があるまでの部分『<br>> 文字<br>』マッチさせたいのです。 つまり、この文字列から「改行から改行までマッチ。途中にbrなんてのがあってもマッチ」 というのだけ取り出したい。ということですか? <?php mb_internal_encoding('sjis'); mb_regex_encoding('sjis');; $str = '<br>> 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ<br>'; //$pat = '(?<=<br>>).*(?=<br>)'; $pat = '<br>>(.*)(?=<br>)'; mb_ereg($pat, $str, $matched); print_r($matched); Array ( [0] => <br>> 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ [1] => 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ ) で、replaceでどういう置き換えをしたいんですか?

共感・感謝の気持ちを伝えよう!

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

>文字列を分けるのではなく、置き換えなんです… >『文字』以外にマッチで、お願いしますm(_ _)m 意味がよくわかんないです。 文字以外にマッチして置き換えたら、「文字」しか残らないですけど・・・ 具体的にこういう文字列をこういう結果にしたいという例をあげてください。 ちなみに、通常マッチするというのはマッチしたものを配列に落とすことをいいます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 [^文]とやると、『文』以外にマッチしますよね。 そして、二文字以上の文字以外にマッチさせたい場合は…どうやるんだ!! ってことです。 単純に、[^文字]とやっても、『文字』以外にマッチという意味にはならないらしく、『文』と『字』という文字以外にマッチという意味になるらしく、 なら、 2文字以上の文字以外にマッチさせたい場合はどうすればいいのですか!? といった感じです。 説明下手ですみませんm(_ _)m

  • 回答No.3
  • Nii
  • ベストアンサー率48% (79/162)

>『文字』という文字列以外にマッチ 条件を忠実に再現すると [^文]*(文+[^文字][^文]*)*文* で、上記引用文では、下記がマッチした文で、『文字』にはマッチしてないが・・・^^; 『文 文 字』という文 』という文 という文 いう文 う文 文 字列以外にマッチ 列以外にマッチ 以外にマッチ 外にマッチ にマッチ マッチ ッチ チ [^文字]*([^文字]) ならば、以下にマッチするが・・・ 『 』という という いう う 列以外にマッチ 以外にマッチ 外にマッチ にマッチ マッチ ッチ チ ※mb_ereg_replaceの置き換えでは、試してないので^^;

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 実際は『文字』ではなく『<br>』以外にマッチです^^ 例 <br>> 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ<br> 行頭に> つまり、<br>のあとに> があれば、 次に<br>があるまでの部分『<br>> 文字<br>』マッチさせたいのです。 しかし、文字部分に、[^<br>]*みたいな表現を使うと、 文字にbやrが入っていると、その文自体がヒットしなくなります。 説明下手ですみませんm(_ _)m とりあえず、<br>以外にマッチさせたいです(.. )

  • 回答No.2

具体的に、どういうテキストを使って置換によってどういう結果を得たいのか サンプルを出してもらえますか? 最初に書いておきますが、××を含まないパターンという正規表現は 書くのは結構面倒くさいです。 #先読みを使うという手もありますが マッチに成功したかどうかの結果をひっくり返して使うとかやった方がわかりやすいし早いでしょう。

共感・感謝の気持ちを伝えよう!

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

正規表現でやるより「文字」でexplodeする方が速いんじゃない? <? $str="これは文字です。文と字で文字です"; $matches=explode("文字",$str); print_r($matches); ?>

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 それじゃあ駄目なんですよね… 文字列を分けるのではなく、置き換えなんです… 『文字』以外にマッチで、お願いしますm(_ _)m

関連するQ&A

  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

  • PHPの正規表現について

    // URLエンコード $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; これをPHPの関数を使った方法と使わなかった方法が知りたいです。 また、正規表現で、ereg.., preg.., mb_eregがありますが、この違いの詳細が知りたいです。

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

    いま.Netで正規表現にチャレンジしているのですが、どこが問題なのか分からず、投稿させていただきました。 正規表現のパターンです。 \\[Cc]\[(?<$0>[0-9]+),(?<$1>[0-9]+),(?<$2>[0-9]+)\] で、マッチさせたい文字列は、 \C[255,255,255] です。「[255,255,255]」の数字の部分は、一桁から三桁までの数字であれば何でもOKです。 マッチしないことは、http://jsregex.com/を使って調べました。 どうぞよろしくお願いします。

  • 文字列全体に対する置き換え [正規表現]

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

    • ベストアンサー
    • PHP
  • php 正規表現で、\マークを取り除くには?

    php で ereg_replace関数を使って¥マークを取り除きたいのですが、 ereg_replace("\\", "",$str); と記述すると Warning: ereg_replace() [function.ereg-replace]: REG_EESCAPE in C:\xampp... とエラーになってしまいます。 どうすれば正規表現により円マークを取り除くことができるのでしょうか?

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

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

    • ベストアンサー
    • PHP
  • 正規表現での置換えについて

    正規表現を使った置換えでどうやったらいいのか悩んでいます。 やり方は、カンマで区切られた数字や英字の列をその先頭だけ残して別の記号(?など)に変換するというものです。 変換例 222,1,33333 は 2??,1,3???? へ置換え 55,22aa は 5?,2??? へ置換え 6 は 6 へ置換え(つまりそのまま) このような置換えをすることは可能でしょうか。 こういう置換えはand条件が使えないと無理なのかなとも思ったりしています。 ただ正規表現にはand条件は無いようですし。(or条件はあるようですが) mb_ereg_replaceを使って明示していただけると助かります。 もちろん複数行になっても問題ありませんし、mb_ereg_replaceでは無理という場合に別の関数を使っていただいても結構です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 0P PHP 正規表現 perlとの違い

    php(PHP5)の正規表現に関する演算子についての質問です。 一つ目の質問 ある特定の1文字が指定した文字列の中に含まれるかどうか調べたいのですが、perlでは「m/a/」のような演算子を使っていました。ですが、PHPでは「m/a/」は使えないようです。PHPでは、どのように記述すればよいのでしょうか? 例 $string = "abcdefg" とし、$stringに「d」が含まれるかどうか調べたい。 ちなみに「stristr」を使用してstristr($string, "d")などとすると, 「d」が$stringに含まれない場合、falseを返してくれるのは良いのですが、含まれる場合、trueではなく文字列の中から一致した検索文字以降を返すのでだめでした(私がどうやるか知らないだけかも)。 2たつ目の質問 また、ある特定の文字の前と後に不特定の一文字又は複数の文字が含まれるかどうか調べたいのですが、以下のような正規表現では、だめでした。 $string ereg(".+@.+",$string) 上記の正規表現の場合、$stringの文字列が「@」一文字だけで「@」の前と後に何の文字もなくてもtrueを返してしまいます(本当は@マークの前後に最低1文字以上の文字列がなければだめなようにしたいのです。)。 どのようにすれば、良いのでしょう? ご存知の方がおられましたら、お教え下さい。 キャサリン

    • ベストアンサー
    • PHP
  • PHPの正規表現による文字列置換について

    下記のような文字列から「abcde」のみを変数に格納したいのですが、正規表現に苦戦しています。 http://example.com/detail.php?p=abcde.php 取得したい「abcde」のみが毎回変わり、その前後は固定です。 preg_replace()を使うのがいいのだろうなと思い、いろいろやってみているのですが、 なかなかマッチさせることができません。 どうかご教示頂けますでしょうか。

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

    こんばんは。夜遅くですが質問させていただきます。 正規表現に関する質問なんですが、仮に contents:yazirobee contents:gokuu contents:tyaozu contents:pikkoro contents:togasi という文字列があったとします。 この文字列の最後に<br />をつけたい場合、 例 contents:yazirobee<br /> contents:gokuu<br /> contents:tyaozu<br /> contents:pikkoro<br /> contents:togasi<br /> 正規表現ではどのように書けばいいでしょうか? ereg_replace("contents:.*","contents:.*<br />",$str) などとおけば、文字列自体が、contents:.*<br />となってしまいます。 pikkoro,tyaozuなどの文字列を崩さずに<br />を付加する方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP