プロが教える店舗&オフィスのセキュリティ対策術

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

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

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

キャサリン

A 回答 (5件)

Pearl は知らないけれど、Perl 互換の正規表現を使えば良いのでは?



ereg (POSIX 拡張正規表現関数) → preg_match (Perl 互換)

参考URL:http://www.php.net/download-docs.php

この回答への補足

umotaさん

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

キャサリン

補足日時:2007/09/16 20:22
    • good
    • 0

質問の一つ目は#1の方の回答のとおりpreg_matchでいいのではないでしょうか?



関数の戻り値が0または1で、マッチに成功していれば1、失敗していれば0ですから、
perl のm演算子と同じ扱いができると思います。
stristrを使う場合でも、戻り値がfalseなのかそれ以外なのかで
判定してやればいいわけで、文字列のある部分以降であるかどうかは
気にする必要はないのではないでしょうか?

質問その2も正規表現はそれでいいはずで、質問にあるパターンなら
"@"にはマッチしないはずです。
戻り値の判定を間違えているとかはないでしょうか?

この回答への補足

sakusaker7さん

ご回答ありがとうございました。
>質問その2の正規表現は、それでいいはず
ちゃんと動作しました。コードの別の部分が間違っていました。

preg_matchは少し調べてみます。もしよろしければ、preg_matchとm演算子を組み合わせた場合の記述例を教えていただけるでしょうか?

キャサリン

補足日時:2007/09/16 22:55
    • good
    • 0

preg_matchとm演算子の組み合わせというのが具体的にどういうことなのか


わかりません。
perl でm演算子を使った書き方をpreg_matchを使ったPHPでは
どう書くのかということでしょうか?

この回答への補足

sakusaker7さん

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

キャサリン

補足日時:2007/09/17 13:44
    • good
    • 0

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]);
}
    • good
    • 0
この回答へのお礼

sakusaker7さん

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

キャサリン

お礼日時:2007/09/18 21:54

perlの正規表現が分かるならpreg_match、preg_match_all等が使えます。


とりあえずマニュアルをよく読んでみて下さい。
http://jp2.php.net/manual/ja/ref.pcre.php
パターン構文は
http://jp2.php.net/manual/ja/reference.pcre.patt …
パターン修飾子は
http://jp2.php.net/manual/ja/reference.pcre.patt …

です。
なお、PHPにはPerl互換のpreg系以外にもereg(posix準拠)、mb_ereg(eregのマルチバイト対応)がありますが、一番汎用性があるのがperl互換ですね。文字コードだけは注意して下さい(ユニコードの場合は修飾子uをつけるなど)。

パターン修飾子に関してはデリミタの後につけて下さい。m、s、i等が使えます。
preg_match("/パターン/ms",$string)

参考まで

この回答への補足

taketan_mydns_jpさん

ご回答ありがとうございました。
簡単には、理解できました。
pregについて少し勉強します。

キャサリン

補足日時:2007/09/18 21:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!