在PHP中,我有一个这样的字符串:
$string = "user@domain.com MIME-Version: bla bla bla";
我如何只收到电子邮件地址?有没有简单的方法来获得价值?
答案 0 :(得分:42)
在mandaleeka答案的基础上,使用空格分隔符打破字符串,然后使用filter_var进行清理,然后验证是否剩余的是合法的电子邮件地址:
function extract_email_address ($string) {
foreach(preg_split('/\s/', $string) as $token) {
$email = filter_var(filter_var($token, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
if ($email !== false) {
$emails[] = $email;
}
}
return $emails;
}
答案 1 :(得分:26)
如果您不确定以空格分隔的字符串的哪一部分是电子邮件地址,则可以按空格分割字符串并使用
filter_var($email, FILTER_VALIDATE_EMAIL)
在每个子字符串上。
答案 2 :(得分:15)
基于constantine regex ..也适用于ip地址域。
$pattern="/(?:[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/";
//$pattern="/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/";
$subject="Hello a@b.com francis a@b words francisfueconcillo@gmail.com words 2 words123 francis@192.168.0.1";
preg_match_all($pattern, $subject, $matches);
答案 3 :(得分:5)
更新@Rob Locken的答案:
function extract_email_address ($string) {
$emails = array();
$string = str_replace("\r\n",' ',$string);
$string = str_replace("\n",' ',$string);
foreach(preg_split('/ /', $string) as $token) {
$email = filter_var($token, FILTER_VALIDATE_EMAIL);
if ($email !== false) {
$emails[] = $email;
}
}
return $emails;
}
答案 4 :(得分:4)
这个小PHP脚本将帮助我们从长段落或文本中提取电子邮件地址。只需复制粘贴此脚本并将其另存为PHP文件(extract.php):
$string="user@domain.com MIME-Version: bla bla bla";
$pattern="/(?:[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/";
preg_match_all($pattern, $string, $matches);
foreach($matches[0] as $email){
echo $email.", ";
}
?>
以上脚本将产生以下结果:
user@domain.com,
答案 5 :(得分:3)
使用正则表达式过滤电子邮件地址非常棘手,因为有太多可能允许的字符。它可以完成,但你可能需要调整它以获得你所需要的。
你可以从这样的事情开始:
$string = "user@domain.com MIME-Version: bla bla bla";
$matches = array();
$pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/'
preg_match($pattern,$string,$matches);
然后$ match应包含您的电子邮件地址。
答案 6 :(得分:2)
如果电子邮件地址始终位于字符串的前面,最简单的方法就是在空格字符的所有实例上拆分字符串,然后从结果数组中取出第一个值。
当然,在使用之前一定要检查它是否类似于电子邮件地址。
有关详细信息,请参阅PHP“拆分”功能。
答案 7 :(得分:1)
这对我有用
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
检测字符串中的任何电子邮件地址
答案 8 :(得分:1)
$text = 'First Last <name@example.com>'
$emails = array_filter(filter_var_array(filter_var_array(preg_split('/\s/', $text), FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL));
答案 9 :(得分:0)
使用正则表达式,您可以识别给定字符串中的任何文本模式。它们非常有用。因此,即使你现在可以坚持从另一个答案中复制粘贴代码片段,你应该考虑再挖一点。
起初可能有点复杂,但绝对值得付出努力。
答案 10 :(得分:0)
如果真的是空格分开的话:
php > $matches = array();
php > preg_match('/^[^ ]*/', $string, $matches);
php > print_r($matches[0]);
user@domain.com
答案 11 :(得分:0)
匹配正则表达式,例如 - ([A-Za-z0-9-]+)@([A-Za-z0-9])\\.([a-z]{3})
或类似的东西。
答案 12 :(得分:0)
我还修改了@Rob Locke的答案。我发现它对我不起作用,因为我必须首先用逗号分隔然后用空格分割。
function extract_email_addresses($sString)
{
$aRet = array();
$aCsvs = explode(',', $sString);
foreach($aCsvs as $sCsv)
{
$aWords = explode(' ', $sCsv);
foreach($aWords as $sWord)
{
$sEmail = filter_var(filter_var($sWord, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
if($sEmail !== false)
$aRet[] = $sEmail;
}
}
return $aRet;
}
答案 13 :(得分:0)
以下解决方案是https://stackoverflow.com/a/47150078/3010827的修改版本,更易于理解
$text = 'First Last <name@example.com>';
// split the string into multiple parts base on a space separator
$parts = preg_split('/\s/', $text);
// Sanitize each part by removing invalid email characters. For example <joe.doe@email.com> will become joe.doe@email.com
$parts = filter_var_array($parts, FILTER_SANITIZE_EMAIL);
// Filter out invalid emails for each part. Valid emails will be kept while invalid ones will be replaced by `false`
$emails = filter_var_array($parts, FILTER_VALIDATE_EMAIL);
// remove `false` values from the array of emails, that's the default behavior of array_filter without the optional callback function
$emails = array_filter($emails);