Как я могу поймать следующие запутанные адреса электронной почты в PHP? - PullRequest
0 голосов
/ 27 июля 2010

Рассмотрим следующий скрипт, содержащий запутанные адреса электронной почты, и функцию, которая пытается заменить их на ***** с помощью сопоставления с регулярным выражением.Мой сценарий пытается перехватить слова: "at", "a t", "a.t", "@", за которым следует некоторый текст (любое доменное имя), затем "dot" "." "d.o.t", за которым следует TLD.

Ввод:

$str[] = 'dsfatasdfasdf asd dsfasdf dsfdsf@hotmail.com'; 
$str[] = 'I live at school where My address is dsfdsf@hotmail.com'; 
$str[] = 'I live at school. My address is dsfdsf@hotmail.com'; 
$str[] = 'at school my address is dsfdsf@hotmail.com'; 
$str[] = 'dsf a t asdfasdf asd dsfasdf dsfdsf@hotmail.com'; 
$str[] = 'd s f d s f a t h o t m a i l . c o m';

function clean_text($text){
    $pattern = '/(\ba[ \.\-_]*t\b|@)[ \.\-_]*(.+)[ \.\-_]*(d[ \.\-_]*o[ \.\-_]*t|\.)[ \.\-_]*(c[ \.\-_]*o[ \.\-_]*m|n[ \.\-_]*e[ \.\-_]*t|o[ \.\-_]*r[ \.\-_]*g|([a-z][ \.\-_]*){2,3}[a-z]?)/iU'; 
    return preg_replace($pattern, '***', $text); 
}

foreach($str as $email){ 
     echo clean_text($email); 
}

Ожидаемый результат:

dsfatasdfasdf asd dsfasdf dsfdsf*** 
I live at school where My address is dsfdsf@***
I live at school. My address is dsfdsf@***
*** 
dsf *** 
d s f d s f *** 

Результат:

dsfatasdfasdf asd dsfasdf dsfdsf*** 
I live *** 
I live *** 
at school my address is dsfdsf****
dsf *** 
d s f d s f *** 

Проблема: Это ловитпервое вхождение «at», а не последнее, поэтому происходит следующее:

input: 'at school my address is dsfdsf@hotmail.com'
produces: '****'
should produce: 'at school my address is dsfdsf****'

Как это исправить?

Ответы [ 3 ]

2 голосов
/ 27 июля 2010

На основе регулярного выражения M42:

Код:

$emails = array(
                'dsfatasdfasdf asd dsfasdf dsfdsf@hotmail.com'
                ,'I live at school where My address is dsfdsf@hotmail.com'
                ,'I live at school. My address is dsfdsf@hotmail.com'
                ,'at school my address is dsfdsf@hotmail.com'
                ,'dsf a t asdfasdf asd dsfasdf dsfdsf@hotmail.com'
                ,'d s f d s f a t h o t m a i l . c o m'
                );

foreach($emails as $email)
{
    $found = preg_match('/(.*?)((\@|a[_. -]*t)[\w .-]*?$)/', $email, $matches);
    if($found)
    {
        echo 'Username: ' . $matches[1] . ', Domain: ' . $matches[2] . "\n";
    }
}

Выход:

Username: dsfatasdfasdf asd dsfasdf dsfdsf, Domain: @hotmail.com
Username: I live at school where My address is dsfdsf, Domain: @hotmail.com
Username: I live at school. My address is dsfdsf, Domain: @hotmail.com
Username: at school my address is dsfdsf, Domain: @hotmail.com
Username: dsf a t asdfasdf asd dsfasdf dsfdsf, Domain: @hotmail.com
Username: d s f d s f , Domain: a t h o t m a i l . c o m
1 голос
/ 27 июля 2010

Этот скрипт на Perl может быть адаптирован к php?

my @l = (
'dsfatasdfasdf asd dsfasdf dsfdsf@hotmail.com',
'I live at school where My address is dsfdsf@hotmail.com',
'I live at school. My address is dsfdsf@hotmail.com',
'at school my address is dsfdsf@hotmail.com',
'dsf a t asdfasdf asd dsfasdf dsfdsf@hotmail.com',
'd s f d s f a t h o t m a i l . c o m'
);

foreach(@l) {
   s/(\@|a[_. -]*t)[\w .-]*?$/****/;
   print $_,"\n";
}

output:

dsfatasdfasdf asd dsfasdf dsfdsf****
I live at school where My address is dsfdsf****
I live at school. My address is dsfdsf****
at school my address is dsfdsf****
dsf a t asdfasdf asd dsfasdf dsfdsf****
d s f d s f ****
0 голосов
/ 27 июля 2010
function clean_text($text){
    $pattern = '/\w+[\w-\.]*(\@\w+((-\w+)|(\w*))\.[a-z]{2,3})/i';
    preg_match($pattern, $text, $matches);

    return (isset($matches[1])) ? str_replace($matches[1], "****", $text) : $text;
}

Единственный, кому это не соответствует, - ваш последний, но вы получаете очко.

...