提取电子邮件:从字符串传递

时间:2019-03-24 09:07:44

标签: php

我的文字类似于下面的示例

$text = "rami@gmail.com:Password
This email is from Gmail
email subscription is valid 

omar@yahoo.com:password 
this email is from yahoo 
email subscription is valid ";

我希望能够检索文本中所有出现的email:password,而无需其余说明。 我尝试了preg_match,但它返回了0个结果,并且爆炸返回了所有带有说明的文本。

非常感谢您的帮助

爆炸
Str_Pos
Preg_match

$text = "rami@gmail.com:Password
This email is from Gmail
email subscription is valid 

omar@yahoo.com:password 
this email is from yahoo 
email subscription is valid ";

2 个答案:

答案 0 :(得分:1)

在处理不切实际的输入字符串时很难确定/精确,但是这种模式为您提取(不验证)email:password行。

从行首开始匹配,匹配已知字符,并且在否定字符类中包括空格字符,以防止匹配下一行。如果愿意,可以使用\n代替\s

代码:(WithUser

$text = "rami@gmail.com:Password
This email is from Gmail
email subscription is valid 

omar@yahoo.com:password 
this email is from yahoo 
email subscription is valid ";

var_export(preg_match_all('~^[^@\s]+@[^:\s]+:\S+~m', $text, $matches) ? $matches[0]: "none");

输出:

array (
  0 => 'rami@gmail.com:Password',
  1 => 'omar@yahoo.com:password',
)

...嗯,我想可以在密码中保留空格,但是如果这样,那么您就不能在逻辑上从密码的右侧修剪空格。允许空间的另一种模式也可以提供单独的捕获组,如下所示:(请参阅Demo(附带条纹),其中密码字符需要特定的模式逻辑以防止第一个捕获组中的贪婪匹配。

var_export(preg_match_all('~([^@\s]+@[^:\s]+):(.*)~', $text, $matches, PREG_SET_ORDER) ? $matches: "none");

相对于[^...](任何字符点),我更喜欢否定的字符类.,因为它允许使用贪婪的量词-这样可以提高模式的效率(无论如何,在步数方面)

答案 1 :(得分:1)

您可以使用正则表达式分别捕获电子邮件和密码。
我捕获到冒号的任何长度的东西,然后再捕获任何东西,直到换行并带有可选空格为止。

preg_match_all("/(.*@.*):(.*?)\s*\n/", $text, $matches);
$matches = array_combine(["match", "email", "password"], $matches);
var_dump($matches);

输出:

array(3) {
  ["match"]=>
  array(2) {
    [0]=>
    string(24) "rami@gmail.com:Password
"
    [1]=>
    string(25) "omar@yahoo.com:password 
"
  }
  ["email"]=>
  array(2) {
    [0]=>
    string(14) "rami@gmail.com"
    [1]=>
    string(14) "omar@yahoo.com"
  }
  ["password"]=>
  array(2) {
    [0]=>
    string(8) "Password"
    [1]=>
    string(8) "password"
  }
}

https://3v4l.org/baeQ0