2009-09-03 152 views
15

可能重复:
How can I convert ereg expressions to preg in PHP?如何更改PHP的eregi到的preg_match

我需要帮助,下面是一个小的非常基本的正则表达式有些验证电子邮件,我不知道它不是最大的工作,但为我的需要,现在可以。

它目前使用PHP的eregi功能这php.net说,现在是一个贬值的功能,我应该使用的preg_match代替,简单地更换的preg_match erei不起作用,有人可以告诉我怎么做工作?

function validate_email($email) { 
    if (!eregi("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
function validate_email($email) { 
    if (!preg_match("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
+0

注意,你不应该使用这个正则表达式验证电子邮件;它严重过时了。 – Piskvor 2014-10-22 15:33:42

+0

@Piskvor我同意,这个问题也是近5年= =)你应该发布更新的答案,如果你喜欢,我总是可以改变“选择”的答案,最好的办法 – JasonDavis 2014-10-22 16:02:43

+0

它的恕我直言,范围以外的ereg/preg问题;评论对我来说似乎就足够了。 – Piskvor 2014-10-22 16:40:44

回答

25

Perl风格的正则表达式模式总是需要分隔。字符串中的第一个字符被认为是分隔符,所以是这样的:

function validate_email($email) { 
    if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 

(显然)找到了原因您最初的尝试没有成功,是因为它试图用^作为分隔符,但没有匹配^为正则表达式的结尾。

+0

谢谢,我刚刚发现了php的FILTER_VALIDATE_EMAIL,好像它可能是最好的方式,但我找不到很多关于它的信息 – JasonDavis 2009-09-03 17:47:13

+2

@jasondavis,'FILTER_VALIDATE_EMAIL'肯定是更好的选择。电子邮件**复杂**。 – TRiG 2011-06-27 14:59:00

10

你需要改变的三件事

  1. 需要添加图案分隔符(可以是任何字符,但最常用的是正斜杠)
  2. [[:alnum:]]将需要更换与PCRE等效
  3. “eregi”中的“i”表示不区分大小写,PCRE用标志执行,具体为i标志。

否则,其余的看起来PCRE兼容(是的,这是一种多余= P)

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i" 
+1

PHP的PCRE包含诸如[:alnum:]之类的选项。 – Amber 2009-09-03 17:50:39