PHPでpreg_matchを使用する場合、「不明な修飾子 'g'in…」?


93

これは私が使おうとしている正規表現です:

/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/gim

このサイトで見つけたので、試してみるとうまくいきます。しかし、コードに配置するとすぐに、次のメッセージが表示されます。

Warning: preg_match() [function.preg-match]: Unknown modifier 'g' in C:\xampp\htdocs\swebook\includes\classes.php on line 22

誰かが何が悪いのか、そしてなぜそれが私のコードではなくそのウェブサイトで機能しているのか説明できますか?


1
正規表現で何をしようとしているのかを正確に知っていれば、より良い支援を提供できます。そして、あなたより良い助けを必要としています-あるいは、とにかく正規表現はそうします。そのサイトで利用できるすべての不十分に書かれた電子メール正規表現の中で、あなたはおそらく最悪のものを選んだかもしれません。:/
アランムーア

2
参考までに、正規表現は次のタイプのメールを検証します: "-.-.-.--。@-some--domain-。com"そしてこれらのタイプの有効なメールは検証しません: "info @subdomain。 domain.com」。最後になりましたが、\ wは非常に危険です。これは、PHP pregがPerl互換の正規表現を使用し、JavascriptのようなPOSIXを使用しないためです。PHPが米国/英国にローカライズされていないサーバーで実行されている場合\ wはアクセント付きの文字にも一致するため、「àèìòù@domain.com」には有効なメールがあります。詳細については、こちらをお読みください:it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio 2010

回答:


170

もし修飾子がありませんgためpreg_match。代わりに、preg_match_all関数を使用する必要があります。

したがって、代わりに:

preg_match("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/gim", ....)

使用する:

preg_match_all("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/im", ....)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.