PHP,提取邮件地址

时间:2013-05-15 08:10:58

标签: php html regex pattern-matching

我有一个问题,我需要帮助修复。我正在尝试创建一个脚本来抓取网站的邮件地址。主要是德语地址,但我不确定如何创建所述脚本,我已经创建了一个已经从所述网站中提取电子邮件地址的地址。但地址之一令人费解,因为没有真正的格式..这里有几个德国地址,可以提供这些数据。

Ilona Mustermann
Hauptstr. 76
27852 Musterheim


Andreas Mustermann
Schwarzwaldhochstraße 1
27812 Musterhausen


D. Mustermann
Kaiser-Wilhelm-Str.3
27852 Mustach

这些只是我想从网站中提取的几个例子。这可能与PHP有关吗?

编辑:

这是我到目前为止所拥有的

function extract_address($str) {
$str = strip_tags($str);
$Name = null;
$zcC = null;
$Street = null;

foreach(preg_split('/([^A-Za-z0-9üß\-\@\.\(\) .])+/', $str) as $token) {
    if(preg_match('/([A-Za-z\.])+ ([A-Za-z\.])+/', $token)){
        $Name = $token;
    }

    if(preg_match('/ /', $token)){
        $Street = $token;
    }

    if(preg_match('/[0-9]{5} [A-Za-zü]+/', $token)){
        $zcC = $token;
    }

    if(isset($Name) && isset($zcC) && isset($Street)){
        echo($Name."<br />".$Street."<br />".$zcC."<br /><br />");
        $Name = null;
        $Street = null;
        $zcC = null;
    }
    }
}

它可以检索$ Name(IE:Ilona Mustermann和City / zipcode(27852 Musterheim),但不确定正则表达式总能找回街道吗?


这是我到目前为止所提出的,它似乎在街道上大约有60%的时间工作,拉链/城市工作100%,名称也是如此。但是,当它试图偶尔提取街道时它就会失败..有什么想法吗?

function extract_address($str) {
    $str = strip_tags($str);
    $Name = null;
    $zcC = null;
    $Street = null;

    foreach(preg_split('/([^A-Za-z0-9üß\-\@\.\(\)\& .])+/', $str) as $token) {
        if(preg_match('/([A-Za-z\&.])+ ([A-Za-z.])+/', $token) && !preg_match('/([A-Za-zß])+ ([0-9])+/', $token)){
            //echo("N:$token<br />");
            $Name = $token;
        }

        if(preg_match('/(\.)+/', $token) || preg_match('/(ß)+/', $token) || preg_match('/([A-Za-zß\.])+ ([0-9])+/', $token)){
            $Street = $token;
        }

        if(preg_match('/([0-9]){5} [A-Za-züß]+/', $token)){
            $zcC = $token;
        }

        /*echo("<br />
            N:$Name
            <br />
            S:$Street
            <br />
            Z:$zcC
            <br />
            ");*/

        if(isset($Name) && isset($zcC) && isset($Street)){
            echo($Name."<br />".$Street."<br />".$zcC."<br /><br />");
            $Name = null;
            $Street = null;
            $zcC = null;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

当然你可能需要使用preg_match()函数。这是关于制作一个好的正则表达式模式。

例如获取后置代码

<?php
$str = "YOUR ADRESSES STRING HERE";
preg_match('/([0-9]+) ([A-Za-z]+)/', $str, $matches);
print_r($matches);

?>

这个正则表达式与你给出的地址相匹配,你需要将它放入你的原生角色。

 [A-Za-züß.]+ [A-Za-z.üß]+\s[A-Za-z. 0-9ß-]+\s[0-9]+ [A-Za-züß.]+

答案 1 :(得分:1)

使用如此复杂的字符串的正则表达式无法获得可靠的答案。这是这个问题的唯一正确答案。

答案 2 :(得分:0)

Vlad Bondarenko是对的。

在CS中说:邮政地址不构成常规语言。

提取信息是一个活跃的研究课题。正则表达式并非完全是假的,但与使用词典(“地名词典”)或更先进的机器学习算法的方法相比,失败率更高。

好的堆栈溢出q / a是How to parse freeform street/postal address out of text, and into components