- ベストアンサー
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文字以上の文字列がなければだめなようにしたいのです。)。 どのようにすれば、良いのでしょう? ご存知の方がおられましたら、お教え下さい。 キャサリン
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
PHPは本職でないので抜けがあるかもしれませんが、 Perl if ($string =~ m/pattern/) { } PHP if (preg_match("/pattern/", $string)) { } Perl while (my ($v) = $string =~ m/pattern/g) { } PHP 該当するパターンはなし? Perl foreach my $v ($string =~ m/pattern/g) { print $v; } PHP $count = preg_match_all("/pattern/", $string, $matches, PREG_SET_ORDER); for ($i=0; $i<$count; $i++) { print($matches[$i][0]); }
その他の回答 (4)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
perlの正規表現が分かるならpreg_match、preg_match_all等が使えます。 とりあえずマニュアルをよく読んでみて下さい。 http://jp2.php.net/manual/ja/ref.pcre.php パターン構文は http://jp2.php.net/manual/ja/reference.pcre.pattern.syntax.php パターン修飾子は http://jp2.php.net/manual/ja/reference.pcre.pattern.modifiers.php です。 なお、PHPにはPerl互換のpreg系以外にもereg(posix準拠)、mb_ereg(eregのマルチバイト対応)がありますが、一番汎用性があるのがperl互換ですね。文字コードだけは注意して下さい(ユニコードの場合は修飾子uをつけるなど)。 パターン修飾子に関してはデリミタの後につけて下さい。m、s、i等が使えます。 preg_match("/パターン/ms",$string) 参考まで
補足
taketan_mydns_jpさん ご回答ありがとうございました。 簡単には、理解できました。 pregについて少し勉強します。 キャサリン
- sakusaker7
- ベストアンサー率62% (800/1280)
preg_matchとm演算子の組み合わせというのが具体的にどういうことなのか わかりません。 perl でm演算子を使った書き方をpreg_matchを使ったPHPでは どう書くのかということでしょうか?
補足
sakusaker7さん ご回答ありがとうございました。 >perl でm演算子を使った書き方をpreg_matchを使ったPHPでは >どう書くのかということでしょうか? 私の質問の意図は、上記にsakusaker7さんがおっしゃるとおりです。 キャサリン
- sakusaker7
- ベストアンサー率62% (800/1280)
質問の一つ目は#1の方の回答のとおりpreg_matchでいいのではないでしょうか? 関数の戻り値が0または1で、マッチに成功していれば1、失敗していれば0ですから、 perl のm演算子と同じ扱いができると思います。 stristrを使う場合でも、戻り値がfalseなのかそれ以外なのかで 判定してやればいいわけで、文字列のある部分以降であるかどうかは 気にする必要はないのではないでしょうか? 質問その2も正規表現はそれでいいはずで、質問にあるパターンなら "@"にはマッチしないはずです。 戻り値の判定を間違えているとかはないでしょうか?
補足
sakusaker7さん ご回答ありがとうございました。 >質問その2の正規表現は、それでいいはず ちゃんと動作しました。コードの別の部分が間違っていました。 preg_matchは少し調べてみます。もしよろしければ、preg_matchとm演算子を組み合わせた場合の記述例を教えていただけるでしょうか? キャサリン
- umota
- ベストアンサー率46% (150/324)
Pearl は知らないけれど、Perl 互換の正規表現を使えば良いのでは? ereg (POSIX 拡張正規表現関数) → preg_match (Perl 互換)
補足
umotaさん ご回答ありがとうございました。 今回の場合、Perl互換ではなく、PHPの正規表現をお聞きしたい趣旨です。 キャサリン
お礼
sakusaker7さん ご回答ありがとうございました。 いただいたサンプルを基に少し勉強します。 キャサリン