PHP 正規表現  - PHPプロ!Q&A掲示板

653

  • 0P

PHP 正規表現 

質問日時 / 2007年9月16日 20:28    回答数 / 4件

Questioner:  docopon  このエントリーをはてなブックマークに追加 

キーワード / 正規表現   



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文字以上の文字列がなければだめなようにしたいのです。)。

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

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

キャサリン

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



ツリー一覧

┗A01TorrySegall>一つ目の質問 あればfalse以外が返り、無ければfal
 ┗A01-1docopon TorrySegall さん ご回答ありがとうございました
  ┗A01-1-1TorrySegall>striposを使用した場合でも ... その通りです。 s
   ┗A01-1-1-1docoponTorrySegallさん ご回答ありがとうございました。

回答一覧

並び替え:

A01 参考になった
answererTorrySegall [9月16日 21:52] (最終編集:9月16日 22:05)

>一つ目の質問
あれば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よりも遅いし、
バイナリセーフではないのでヌルバイト攻撃に対する脆弱性の原因にもなりかねません。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerdocopon [9月17日 13:27]

 TorrySegall さん

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

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

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


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

キャサリン

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyerTorrySegall [9月17日 22:49]

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

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerdocopon [9月18日 21:34]

TorrySegallさん

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

キャサリン

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)