如何使规则表达正确?

时间:2018-06-21 23:31:53

标签: php regex php-7

我对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时,它具有解析错误。

谢谢,

1 个答案:

答案 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)如果本地部分有效:如果第二个元素/域部分封装在方括号([])中或不包含方括号(您可以仅使用substrsubstr_count为此,因为它将比正则表达式快得多),并且它与模式匹配:

preg_match("/^\[?[0-9A-Za-z\-\.]+\]?$/",$domainPart);

那么它是有效的。

注意:根据标准,电子邮件地址实际上可以包含注释(为什么,我不知道)。注释实际上不是电子邮件地址的一部分,并且在使用时会被删除。因此,我不必理会它们。