PHP中的正则表达式,用于过滤@name或@ name.lastname

问题描述

我有一个正则表达式,例如preg_match_all(PHP),可过滤文本中的电子邮件

示例

txt = " tenho ujm texto onde tem um e-mail [email protected] e seu amigos <a> [email protected] </a> 
        [email protected] sem contar";

return: [email protected],[email protected],[email protected]

我需要从文本中过滤所有@ 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]+

Regex demo | Php demo

请注意,您不必转义\@,并且可以重复字符类本身[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-]+)/';