我有一个像 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]+
注意,您不必转义 \@
并且可以重复字符类本身 [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/