php - PHP中的正则表达式过滤@name或@name.lastname

标签 php regex codeigniter-3 preg-match-all

我有一个像 preg_match_all (PHP) 这样的正则表达式,可以过滤文本中的电子邮件。

示例:

txt = " tenho ujm texto onde tem um e-mail <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1f787a706d7876706c5f6b7a6c6b7a317c7072" rel="noreferrer noopener nofollow">[email protected]</a> e seu amigos <a> <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d4b3b1bba6b3bdbba794b8b5a7bffab7bbb9" rel="noreferrer noopener nofollow">[email protected]</a> </a> 
        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7c11150e151d123c1e1d1b1d0813521f1311" rel="noreferrer noopener nofollow">[email protected]</a> sem contar";

return: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8cebe9e3feebe5e3ffccf8e9fff8e9a2efe3e1" rel="noreferrer noopener nofollow">[email protected]</a>, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6601030914010f0915260a07150d4805090b" rel="noreferrer noopener nofollow">[email protected]</a>, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ff92968d969e91bf9d9e989e8b90d19c9092" rel="noreferrer noopener nofollow">[email protected]</a>

我需要从文本中过滤所有@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 次或多次,因此点后还应该至少有一个字符 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
)

关于php - PHP中的正则表达式过滤@name或@name.lastname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63583932/

相关文章:

php - 使用 Laravel 中的数据库创建父子管理菜单树

PHP 严格反序列化

php - PHP中Json解码以及如何读取键值

javascript - 以安全的方式使用 ajax 传递 ID 值

javascript - 在正则表达式中按模式替换

mysql - MYSQL 中的 REGEX 不起作用?

javascript - 正则表达式替换未终止的括号

php - 检索存储在关联数组中的 session 值 CodeIgniter

php - 无法在 codeigniter 3.0 中获取 session_id

javascript - 检测ajax请求的请求url