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

问题描述

我有一个正则表达式,例如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]+

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-]+)/';

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...