• ベストアンサー

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
  • 回答数5
  • ありがとう数1

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

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]); }

kitty1000
質問者

お礼

sakusaker7さん ご回答ありがとうございました。 いただいたサンプルを基に少し勉強します。 キャサリン

その他の回答 (4)

回答No.5

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) 参考まで

kitty1000
質問者

補足

taketan_mydns_jpさん ご回答ありがとうございました。 簡単には、理解できました。 pregについて少し勉強します。 キャサリン

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

preg_matchとm演算子の組み合わせというのが具体的にどういうことなのか わかりません。 perl でm演算子を使った書き方をpreg_matchを使ったPHPでは どう書くのかということでしょうか?

kitty1000
質問者

補足

sakusaker7さん ご回答ありがとうございました。 >perl でm演算子を使った書き方をpreg_matchを使ったPHPでは >どう書くのかということでしょうか? 私の質問の意図は、上記にsakusaker7さんがおっしゃるとおりです。 キャサリン

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

質問の一つ目は#1の方の回答のとおりpreg_matchでいいのではないでしょうか? 関数の戻り値が0または1で、マッチに成功していれば1、失敗していれば0ですから、 perl のm演算子と同じ扱いができると思います。 stristrを使う場合でも、戻り値がfalseなのかそれ以外なのかで 判定してやればいいわけで、文字列のある部分以降であるかどうかは 気にする必要はないのではないでしょうか? 質問その2も正規表現はそれでいいはずで、質問にあるパターンなら "@"にはマッチしないはずです。 戻り値の判定を間違えているとかはないでしょうか?

kitty1000
質問者

補足

sakusaker7さん ご回答ありがとうございました。 >質問その2の正規表現は、それでいいはず ちゃんと動作しました。コードの別の部分が間違っていました。 preg_matchは少し調べてみます。もしよろしければ、preg_matchとm演算子を組み合わせた場合の記述例を教えていただけるでしょうか? キャサリン

  • umota
  • ベストアンサー率46% (150/324)
回答No.1

Pearl は知らないけれど、Perl 互換の正規表現を使えば良いのでは? ereg (POSIX 拡張正規表現関数) → preg_match (Perl 互換)

参考URL:
http://www.php.net/download-docs.php
kitty1000
質問者

補足

umotaさん ご回答ありがとうございました。 今回の場合、Perl互換ではなく、PHPの正規表現をお聞きしたい趣旨です。 キャサリン

関連するQ&A

  • PHP、正規表現の使い方

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

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

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

    • ベストアンサー
    • PHP
  • Perlの正規表現

    Perlの正規表現である文字列に文字列STRINGが含まれないようにするには ^(?!.*STRING).+$ と書くとググったら出てきました. ですが,?!について詳しいことまで書いてるサイトはありませんでした. ?!は具体的にはどのようなことをするのでしょうか?

  • Perl・正規表現が分かりません

    Perlでプログラムを書く場合、 ある文字列の文字数が5文字且つ、文字列の先頭に[0-5A]を必ず含み、そして残り4文字にも[0-5A]のみを必ず含む場合、Trueを表示。 それ以外はErrを表示する。 多分、全て、正規表現でできると思うのですが、分かりません。教えていただけないでしょうか? 宜しくお願い致します。 $test = "0AAAA"; if(正規表現){ print "True"; }else{ print "Err"; } ↑結果:True $test = "aAAAA";の場合、 結果:Err

    • ベストアンサー
    • Perl
  • PHPの正規表現「ereg」で特定の数字範囲をマッチさせたい

    PHPの正規表現「ereg」で特定の数字範囲をマッチさせたい 宜しくお願い致します。 PHPの正規表現で、0~99までの数字があり、そのうち、「4~6」と「11~15」までの数字以外の場合にマッチさせる正規表現について教えて下さい。 自分なりに作ってみた正規表現パターンは下記の通りです。 ereg("([^4-6]{1})|[^11-15])",$hoge) もしくは ereg("([^4-6]{1})|[^11-15]{2})",$hoge) で試してみましたが、「4~6」はマッチしないのですが、「11~15」の時にもマッチしてしまいます。 どうすればいいのか、どなたか助けて下さいー!

    • ベストアンサー
    • 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
  • php 正規表現で(ただし○○は除く)という処理をしたい

    正規表現を使って複数条件を指定する場合 "文字列内に●がはいっていたらtrue  もしくは、先頭に▲がある場合はfalse" という、論理和的な条件は分かるのですが、 "文字列内に●がはいっていたらtrue  ただし先頭に▲がある場合はfalse" という、論理積的な条件の作り方がよく分かりません。 前者では、「もしくは」になってしまうので 先頭に▲があろうがなかろうが、●さえ入っていればtrueになってしまいます。 しかし、やりたいのは「ただし」であり ●がたとえ入っていようと、▲が先頭にあればflaseにしたいのです。 どうすれば、後者の条件を正規表現で実現できるでしょうか?

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

    phpの正規表現についてです。 よく入力されたメール・パスワードを判定するのに正規表現で判定させますが、今回の指定する条件は… ・半角英数、0~9の組み合わせ ・使用禁止文字は \ ' @ [ ] の5つ ・入力は8文字以内 例 if(ereg("^[0-9a-z\!\"\#\$\%\&\(\)\=\-\~\|\{\}\;\:\+\*\,\.\/\<\>\?\_]{1,8}$", $pw)){ 記号の意味でよくわからないのがあるのですが、 { }は文字数を指定するものでよろしいのでしょうか? {1,8} は1~8文字までという意味? \が入ると認証が通ってしまってい、困っています。 ユーザーの入力    MySQLの取得結果 例 123\        → データが入らない   \123        → 123   \\123        → \123   123\123      → 123123   \\          → \ といった不具合になってしまい、MySQL側でも入力されたデータと異なったデータが入ってしまいます。\が入っても認証されないようにするにはどうすればいいんでしょうか? 正規表現の参考にしたサイトは http://itbtech.itboost.co.jp/php/php_06.php です。アドバイスよろしくお願いいたします。

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

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

    • ベストアンサー
    • PHP
  • Perl正規表現(置換)

    Perlを用いてテキスト中の文字列 /^\d+$|^\d+\.[05]{1}$/ を、以下の文字列に置換したい場合、 うまくやる方法はないでしょうか? /^[0]+$|^[0]+\.[0]+$/ 正規表現を使いたいですが、 1つ1つエスケープしていくのはさすがに・・・ よろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう