如何在PHP中运行这个正则表达式来解析带有名称的完整电子邮件地址?

如何在PHP中运行这个正则表达式来解析带有名称的完整电子邮件地址?,php,regex,Php,Regex,我有一个正则表达式: ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<

我有一个正则表达式:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
以下代码::)以下以下以下代码:::)以下以下以下以下代码::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[[[[[[\x01-x01-\x01-x01-x01-\x01-\x01-x01-\x01-x01-x01-x01-X0-X0-Z0-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z[a-zA-Z\d\-]+(?)$ 这是假设解析完整的电子邮件与名称和一切,我不能让它在PHP中运行,请帮助

以下是我尝试过的:

$test = "Joe Doe <doe@example.com>";
$emailRegex = '@^((?>[a-zA-Z\d!#$%&\'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&\'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$@';
preg_match($emailRegex, $test, $curResult);
print_r($curResult);
$test=“乔·多伊”;
本次((((((((((((((((((((((((((((((((((((((((((((((((((((([[[[[[x01-\x01-\x01-\X7\x01-\x01-\x01-\X7-x01-\X7 7 7 7 7 7 7 7 7 7 7 7 7)))7)7)7)7))))))以下以下以下以下以下以下以下以下以下以下以下以下,,,(((((((((((((((((((((((((((((((((()))))))))))))))))))将[[a-a-a-a-a-a-a-a-扎扎扎扎扎-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z(((?!-)[a-zA-Z\d\-]+(?)$@;
预匹配($emailRegex,$test,$curResult);
打印(currensult);

在PHP中,您不需要这样的monster正则表达式,您只需使用内置的验证器即可:

例如,将只执行第一个
echo

<?php
$email_a = 'joe@example.com';
$email_b = 'bogus';

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
    echo "This ($email_a) email address is considered valid.";
}
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) {
    echo "This ($email_b) email address is considered valid.";
}
?>

保持简单。因为我们知道我们可以用它来:

再往前走一步,我们也可以抓住这个名字:

^(.*?) *(<[^ ]+@[^ ]+\.[^ ].+>)$
^(.*)*()$
试试看


$emailRegex=“/([\w\s]+)\如果自定义函数正好满足您的需要,我不会编写自定义函数。

因为您使用
@
作为分隔符,所以您需要转义用于电子邮件地址的
@
)。请不要为同一个问题创建新问题。这不是同一个问题,正则表达式是不同的。请注意FILTER_VALIDATE_EMAIL-。我不是在尝试筛选电子邮件,而是在尝试解析它们。
var_dump(FILTER_var(“Joe Doe”,FILTER_VALIDATE_EMAIL));
=>false。OP不是试图解析电子邮件地址,而是试图解析地址字符串,这是两码事。
^(.*?) *(<[^ ]+@[^ ]+\.[^ ].+>)$