问题描述
我有一个正则表达式,例如preg_match_all(PHP),可过滤文本中的电子邮件。
示例:
txt = " tenho ujm texto onde tem um e-mail georgios@teste.com e seu amigos <a> georgios@lask.com </a>
mirian@bagato.com sem contar";
return: georgios@teste.com,georgios@lask.com,mirian@bagato.com
我需要从文本中过滤所有@ firstname.name或@name。
示例:
txt = "Testando se essa pescaria é valida @ju1lio.leao,se não for aciona @alycianne.
Importante deixar @mirian ciente. E a @simone.akemi de sobreaviso.";
return: @mirian,@ju1lio.leao,@alycianne,@simone.akemi
我当前正在使用模式:
pattern = '/\@([a-z0-9\-])+/i';
pattern1 = '/\@(([a-z0-9\-])+\.)+([a-z0-9])+/i';
Return: Array
(
[0] => @alycianne
[1] => @ju1lio
[2] => @ju1lio.leao
[3] => @mirian
[4] => @simone
[5] => @simone.akemi
)
表达式从文本中错误地过滤了名称。一些帮助/想法吗?
解决方法
在第一个模式中使用\@[a-z0-9\-\.]+
也将与@alycianne.
中的点匹配,该点看起来像字符串的结尾。
在您尝试过\@(([a-z0-9\-])+\.)+([a-z0-9])+
的第二种模式中,您将第一组重复1次或更多次。该组以点结尾,因此要进行匹配,至少应有一个点。
该组的第二部分也重复了1次或更多次,因此点后至少还应该有一个char a-z0-9。
要获得全部4个匹配项,您可以使用*
@(?:[a-z0-9-]+\.)*[a-z0-9]+
请注意,您不必转义\@
,并且可以重复字符类本身[a-z0-9]+
而不是匹配捕获组中的单个字符,并且然后重复该组。
示例代码
$txt = "Testando se essa pescaria é valida @ju1lio.leao,se não for aciona @alycianne.
Importante deixar @mirian ciente. E a @simone.akemi de sobreaviso.";
$pattern = "/@(?:[a-z0-9-]+\.)*[a-z0-9]+/";
preg_match_all($pattern,$txt,$matches);
print_r($matches[0]);
输出
Array
(
[0] => @ju1lio.leao
[1] => @alycianne
[2] => @mirian
[3] => @simone.akemi
)
,
您只能使用一种模式:
$pattern = '/\@[a-z0-9-]+(?:\.?[a-z0-9-]+)/';