在php中的字符串模式后删除所有内容

时间:2017-11-09 13:11:29

标签: php

我有一个模式列表:$allowedTLDS = array(".de", ".at", ".ch", ".org", ".com", ".eu");

现在我有一个像30212622mail@myname.com这样的字符串,我希望在.com之后删除所有内容以获取普通邮件地址。 到目前为止我写过这个函数:

function extract_correct_email_address($string){
    $allowedTLDS = array(".de", ".at", ".ch", ".org", ".com", ".eu");
    $foundMatch = false;
    $foundTLD = "";
    foreach ($allowedTLDS as $tld) {
        if (strpos($string, $tld) !== FALSE) {
            //found a match
            $foundMatch = true;
            $foundTLD = $tld;
            break 1;
        }
    }

    if($foundMatch){
        $str = strtok( $string, $foundTLD).$foundTLD;

        return $str;
    }


    return NULL;
}

现在我有了这些地址,我在右侧获得输出:

input: info@meq.dewww.meq.de 
output: info@meq.de 
expected: info@meq.de (this one is correct)

input: info@cool-name.de 
output: info@co.de 
expected: info@cool-name.de

input: something-cool123@nice.decool123.nice.de 
expected: something-cool123@nice.de

我希望我想归档的内容是可以理解的。我在功能上做错了什么?

3 个答案:

答案 0 :(得分:2)

使用这个很好的正则表达式 - 你只需添加TLD:

function extract_correct_email_address($string){
    // pattern do match email addresses
    $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.(de|at|ch|org|com|eu)(?:\.[a-z]{2})?/i'; 
    preg_match($pattern, $string, $matches);

    if(count($matches[0])<1) {
        return null;
    }
    return $matches[0];
}


// example string         
$string = 'fdsaf das D hansi@test.dewww.lol.net franz@gibts.atdasf dasf asd';
var_dump(extract_correct_email_address($string));

结果:

  

string(15)“hansi@test.de”

当然,您可以将其扩展为用于提取多个电子邮件。而不是matches[0]而是检查所有匹配。

答案 1 :(得分:1)

你可以试试这个。我只是在“@”之后检查这个部分。可能有人将其命名为“miller.denis@bla.com”,以便.de也会被解析

public function parseMail(){
    $string = "something-cool123@nice.decool123.nice.de";
    $allowedTLDS = array(".de", ".at", ".ch", ".org", ".com", ".eu");
    $mail = explode("@", $string);
    foreach ($allowedTLDS as $tld) {
        if (strpos($mail[1], $tld) !== FALSE) {
            //found a match
            $foundTLD = $tld;
            dump($mail[1]);
            $str = strtok($mail[1], $foundTLD);
            return $mail[0].'@'.$str.$foundTLD;
        }
    }
    return NULL;
}

答案 2 :(得分:0)

请尝试使用regexp:

preg_replace('/(\.(de|at|ch|org|com|eu)).*$/', '\1', $email);

只需在括号内添加$allowedTLDS

实施例

$ php -r "echo preg_replace('/(\.(de|at|ch|org|com|eu)).*$/', '\1', 'info@meq.dewww.meq.de') . PHP_EOL;"
> info@meq.de
$ php -r "echo preg_replace('/(\.(de|at|ch|org|com|eu)).*$/', '\1', 'info@cool-name.de') . PHP_EOL;"
> info@cool-name.de
$ php -r "echo preg_replace('/(\.(de|at|ch|org|com|eu)).*$/', '\1', 'something-cool123@nice.decool123.nice.de ') . PHP_EOL;"
> something-cool123@nice.de