- ベストアンサー
PHP 正規表現
はじめまして^^ 現在、PHPでプログラムを作っています。 そして、文字列の置き換えをする機会があり、 正規表現をつかうことになりました!! 置き換えに使う関数は、mb_ereg_replaceです! ある条件にあった部分の文字列を置き換えしたいと思っています。 そして、いろいろとやっていきましたら、あるひとつの壁にぶつかりました。。 例えば、PHPでは、正規表現の部分を [^文字]とやると、『文』と『字』という文字列以外にマッチという意味になるらしいのですが、 『文字』という文字列以外にマッチ、というふうに、表現したい場合は、 どう表現すればよいのですか? [^(文字)]とか、その他いろいろ、 自分なりに、色々ためしたのですが、うんともすんともいいません、、 どなたか、わかる方教えて下さいm(_ _)m
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>『<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; ?>
その他の回答 (5)
- sakusaker7
- ベストアンサー率62% (800/1280)
なに、俺だけシカトかい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でどういう置き換えをしたいんですか?
- yambejp
- ベストアンサー率51% (3827/7415)
>文字列を分けるのではなく、置き換えなんです… >『文字』以外にマッチで、お願いしますm(_ _)m 意味がよくわかんないです。 文字以外にマッチして置き換えたら、「文字」しか残らないですけど・・・ 具体的にこういう文字列をこういう結果にしたいという例をあげてください。 ちなみに、通常マッチするというのはマッチしたものを配列に落とすことをいいます。
- Nii
- ベストアンサー率48% (79/162)
>『文字』という文字列以外にマッチ 条件を忠実に再現すると [^文]*(文+[^文字][^文]*)*文* で、上記引用文では、下記がマッチした文で、『文字』にはマッチしてないが・・・^^; 『文 文 字』という文 』という文 という文 いう文 う文 文 字列以外にマッチ 列以外にマッチ 以外にマッチ 外にマッチ にマッチ マッチ ッチ チ [^文字]*([^文字]) ならば、以下にマッチするが・・・ 『 』という という いう う 列以外にマッチ 以外にマッチ 外にマッチ にマッチ マッチ ッチ チ ※mb_ereg_replaceの置き換えでは、試してないので^^;
補足
回答ありがとうございます。 実際は『文字』ではなく『<br>』以外にマッチです^^ 例 <br>> 改行から改行までマッチ。途中にbrなんていうのがあってもマッチ<br> 行頭に> つまり、<br>のあとに> があれば、 次に<br>があるまでの部分『<br>> 文字<br>』マッチさせたいのです。 しかし、文字部分に、[^<br>]*みたいな表現を使うと、 文字にbやrが入っていると、その文自体がヒットしなくなります。 説明下手ですみませんm(_ _)m とりあえず、<br>以外にマッチさせたいです(.. )
- sakusaker7
- ベストアンサー率62% (800/1280)
具体的に、どういうテキストを使って置換によってどういう結果を得たいのか サンプルを出してもらえますか? 最初に書いておきますが、××を含まないパターンという正規表現は 書くのは結構面倒くさいです。 #先読みを使うという手もありますが マッチに成功したかどうかの結果をひっくり返して使うとかやった方がわかりやすいし早いでしょう。
- yambejp
- ベストアンサー率51% (3827/7415)
正規表現でやるより「文字」でexplodeする方が速いんじゃない? <? $str="これは文字です。文と字で文字です"; $matches=explode("文字",$str); print_r($matches); ?>
補足
回答ありがとうございます。 それじゃあ駄目なんですよね… 文字列を分けるのではなく、置き換えなんです… 『文字』以外にマッチで、お願いしますm(_ _)m
お礼
回答ありがとうございます。 [^文]とやると、『文』以外にマッチしますよね。 そして、二文字以上の文字以外にマッチさせたい場合は…どうやるんだ!! ってことです。 単純に、[^文字]とやっても、『文字』以外にマッチという意味にはならないらしく、『文』と『字』という文字以外にマッチという意味になるらしく、 なら、 2文字以上の文字以外にマッチさせたい場合はどうすればいいのですか!? といった感じです。 説明下手ですみませんm(_ _)m