<< フォームに入力した「ソ」のあとに半... 質問一覧 戻るボタンでの再送信不要の方法 >>

  • 0P
PHP 正規表現 



php(PHP5)の正規表現に関する演算子についての質問です。

一つ目の質問
ある特定の1文字が指定した文字列の中に含まれるかどうか調べたいのですが、perlでは「m/a/」のような演算子を使っていました。ですが、PHPでは「m/a/」は使えないようです。PHPでは、どのように記述すればよいのでしょうか?


$string = "abcdefg"
とし、$stringに「d」が含まれるかどうか調べたい。
ちなみに「stristr」を使用してstristr($string, "d")などとすると,
「d」が$stringに含まれない場合、falseを返してくれるのは良いのですが、含まれる場合、trueではなく文字列の中から一致した検索文字以降を返すのでだめでした(私がどうやるか知らないだけかも)。

2たつ目の質問
また、ある特定の文字の前と後に不特定の一文字又は複数の文字が含まれるかどうか調べたいのですが、以下のような正規表現では、だめでした。
  1. $string
  2. ereg(".+@.+",$string)

上記の正規表現の場合、$stringの文字列が「@」一文字だけで「@」の前と後に何の文字もなくてもtrueを返してしまいます(本当は@マークの前後に最低1文字以上の文字列がなければだめなようにしたいのです。)。

どのようにすれば、良いのでしょう?

ご存知の方がおられましたら、お教え下さい。

キャサリン

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

QPHP 正規表現  docopon  [09月16日 20時28分] 
┗参考になったRe:PHP 正規表現  TorrySegall  [09月16日 21時52分] 
  ┗Re:Re:PHP 正規表現  docopon  [09月17日 13時27分] 
    ┗満開Re:Re:Re:PHP 正規表現  TorrySegall  [09月17日 22時49分] 
      ┗Re:Re:Re:Re:PHP 正規表現  docopon  [09月18日 21時34分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:PHP 正規表現 

>一つ目の質問
あればfalse以外が返り、無ければfalseが返る。なら充分なような気がしますが^^;
$string='hoge0' のときに if (stristr($string, '0')) で正判定にならないのが不味いですか?
ならば if (stristr($string, '0') !== false) で判定しましょう。
(ちなみに、こちらのほうが内部的に '0' をfalseに変換する処理が発生しないぶん、実は高速だったりします
 ネタ元→ http://www.phppro.jp/phptips/archives/vol48/#2 

ただし、strstr関数のマニュアルには
>もし特定の haystack に needle があるかどうかを調べるだけの場合、 より早く少ないメモリを使用する strpos() を代わりに使用してください。 
と、あります。
この場合も stristr ではなく、stripos を使うべきでしょうね。

>二つ目の質問
私の環境では ereg(".+@.+", "@") はfalseが返りますが?
マニュアルでは特にini設定に関する記述は無いので、バージョン的な差異ですかね…

というか、正規表現はpreg系関数を使ったほうが良いと思いますよ?
ereg系はスラッシュのエスケープが要らないぶん、見た目スッキリで良さげに思えますが
pregよりも遅いし、
バイナリセーフではないのでヌルバイト攻撃に対する脆弱性の原因にもなりかねません。

Re:Re:PHP 正規表現 

 TorrySegall さん

ご回答ありがとうございました。

>ならば if (stristr($string, '0') !== false) で判定しましょう。
了解しました。

>この場合も stristr ではなく、stripos を使うべきでしょうね。
striposを使用した場合でも正判定はif (stripos ($string, '0') !== false) の記述でよいのでしょうか?


>二つ目の質問
>私の環境では ereg(".+@.+", "@") はfalseが返りますが?
ereg(".+@.+", "@") に関しては、動作しました。動作しなかったのは、別の部分のコードの記述ミスのせいでした。

キャサリン

Re:Re:Re:PHP 正規表現 

striposを使用した場合でも ...
その通りです。
striposは先頭文字がヒットした場合に 0 が返りますので、やはり『厳密な比較』を行なわないとfalse扱いされて誤判定になります。

Re:Re:Re:Re:PHP 正規表現 

TorrySegallさん

ご回答ありがとうございました。
理解しました。

キャサリン
フォームに入力した「ソ」のあとに半... 質問一覧 戻るボタンでの再送信不要の方法