我对regex或php不太熟悉,此行不断返回解析错误以检测电子邮件模式:
与preg_match以及我从ereg更改的以下内容:
if(!preg_match(“ / ^(([[A-Za-z0-9!#$%&'* + / =?^ _ {|}~-][A-Za-z0-9!#$%&'*+\/=?^_
{|}〜\ .-] {0,63}) |(\“ [^(\ | \”)] {0,62} \“))$ \”,$ local_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]))
我尝试在以下/
之前和之后添加/
,看来没问题。
^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$
其余的说:
解析错误:语法错误,意外的“”,“”(T_CONSTANT_ENCAPSED_STRING),预期为“,”或“)”
如何使其正确?当我从ereg切换到preg_match时,它具有解析错误。
谢谢,
答案 0 :(得分:0)
根据实际标准而不只是"[0-9A-z]@[0-9A-z]\\.(?i:[A-Z])"
检查电子邮件的有效性?
太棒了。作为在电子邮件地址中使用连字符的人,我希望有更多像您这样的网络开发人员!
以下是根据RFC标准进行匹配的正则表达式:
"/^([0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~.\E]+|(?:[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~.\E]+\.\"(?:[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~. (),:;<>@[]\E]+|\\\\\\\\|\\\\\")+\"\.)+[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~.\E]+|\"(?:[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~. (),:;<>@[]\E]+|\\\\\\\\|\\\\\")+\")@(?:[0-9A-Za-z\-\.]+|\[[0-9A-Za-z\-\.]+\])$/"
Y。如您所见,该模式有多个部分,if语句逻辑要快得多,并且可以减少这种模式的麻烦。
因此,如果您关心这种事情,我建议编写一个函数来检查电子邮件地址,如下所示:
1)检查电子邮件地址的本地或域部分均没有前导,尾随或连续的点,并且格式正确。例如
if (!preg_match("/^\.|\.\.|\.@|@\.|\.$/",$email) && preg_match("/^[^@]+?@[^\\.]+?\..+$/",$email)) {
这可以确保下一部分有一个'@'符号,如果此处失败,则可以节省很多不必要的计算。
2)用'@:'标记电子邮件地址
$part = explode("@",$email);
3)当然,可能有多个'@',因此,如果数组具有两个以上的元素,请遍历每个元素并重新连接除最后一个元素以外的所有元素,这样您将获得两个字符串:local部分(强制性@之前)和域部分。
4)如果地址的第一个元素/本地部分不包含任何引号(&#36;),则使用以下模式:
$pattern = "/^[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~.\E]+$/";
5)否则,如果本地部分以引号开头且以引号结尾,请使用以下模式:
$pattern = "/^\"(?:[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~. (),:;<>@[]\E]+|\\\\\\\\|\\\\\")+\"$/";
5)否则,如果本地部分包含两个引号(仅一个引号将无效),请使用以下模式:
$pattern = "/^(?:[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~.\E]+\.\"(?:[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~. (),:;<>@[]\E]+|\\\\\\\\|\\\\\")+\"\.)+[0-9A-Za-z\/\Q!#$%&'*+-=?^_`{}|~.\E]+$/";
7)否则第一部分无效。
8)如果本地部分有效:如果第二个元素/域部分封装在方括号([])中或不包含方括号(您可以仅使用substr
和substr_count
为此,因为它将比正则表达式快得多),并且它与模式匹配:
preg_match("/^\[?[0-9A-Za-z\-\.]+\]?$/",$domainPart);
那么它是有效的。
注意:根据标准,电子邮件地址实际上可以包含注释(为什么,我不知道)。注释实际上不是电子邮件地址的一部分,并且在使用时会被删除。因此,我不必理会它们。