Php5を使用して、入力値が有効なメールアドレスであることを検証するにはどうすればよいですか。今、私はこのコードを使用しています
function isValidEmail($email){
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
if (eregi($pattern, $email)){
return true;
}
else {
return false;
}
}
ただし、非推奨のエラーが表示されます。この問題を修正するにはどうすればよいですか。私を助けてください。
filter_var()
関数を使用できます。これにより、多くの便利な検証および無害化オプションが提供されます。
filter_var($email, FILTER_VALIDATE_EMAIL)
PHP> = 5.2.0で利用可能
関数に依存するコードを変更したくない場合は、次のようにします。
function isValidEmail($email){
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
注:他の用途(正規表現が必要な場合)では、廃止されたereg
関数ファミリー(POSIX Regex関数)をpreg
ファミリー(- PCRE正規表現関数 )。わずかな違いがありますが、マニュアルを読むだけで十分です。
更新1: @ binaryLV :で指摘されているとおり
PHP 5.3.3および5.2.14には、FILTER_VALIDATE_EMAILに関連する bug があり、大きな値を検証するとセグメンテーション違反が発生しました。このための簡単で安全な回避策は、
strlen()
の前にfilter_var()
を使用することです。 5.3.4 finalについてはわかりませんが、5.3.4スナップショットバージョンの一部も影響を受けたと書かれています。
このバグはすでに修正されています。
Update 2:このメソッドは、実際には有効な電子メールアドレスであるため、bazmega@kapa
が有効な電子メールアドレスであることを検証します。しかし、ほとんどの場合、インターネットでは、電子メールアドレスにTLDが必要です:[email protected]
。この ブログ投稿 (リンク投稿 @ Istiaque Ahmed )で示唆されているように、ドメイン部分にドットの存在をチェックする正規表現でfilter_var()
を増やすことができます( validTLDはチェックしません):
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
}
@ Eliseo Ocampos が指摘したように、この問題はPHP 5.3より前にのみ存在します。 そのバージョンでは正規表現を変更しました あなたがする必要はありません。
http://www.php.net/manual/en/function.ereg.php のメモを参照してください。
Note:
PHP 5.3.0以降、 PCRE拡張 の代わりに、正規表現拡張は非推奨になりました。この関数を呼び出すと、E_DEPRECATED通知が発行されます。 PCREへの変換のヘルプについては、 相違点のリスト を参照してください。
Note:
preg_match() は、Perl互換の正規表現構文を使用し、多くの場合、ereg()のより高速な代替手段です。
これは古い記事ですが、ここで1つの問題に言及したことがないため、私のソリューションを1つ紹介します。
新しいメールアドレスには、UTF-8文字または.live
、.news
などの特別なドメイン名を含めることができます。
また、いくつかの電子メールアドレスがCyrilicにある場合があり、すべての場合に標準の正規表現またはfilter_var()
が失敗することがわかります。
それが私がそれに対する解決策を作った理由です:
function valid_email($email)
{
if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
return false;
else
{
$email=trim(strtolower($email));
if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
else
{
$pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
return (preg_match($pattern, $email) === 1) ? $email : false;
}
}
}
この機能は、すべてのケースとメール形式で完全に機能します。
私はいつもこれを使用します:
function validEmail($email){
// First, we check that there's one @ symbol, and that the lengths are right
if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {
return false;
}
}
if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
return false;
}
}
}
return true;
}
つかいます:
var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(),
new DNSCheckValidation()
]);
$validator->isValid("[email protected]", $multipleValidations); //true
電子メールを検証するためのregex
およびfilter_var()
ソリューションには近づかないでください。この回答を参照してください: https://stackoverflow.com/a/42037557/9538