0

我有一个问题需要帮助解决。我正在尝试创建一个脚本来抓取网站以获取邮寄地址。主要是德国地址,但我不确定如何创建所述脚本,我已经创建了一个从所述网站提取电子邮件地址的脚本。但是地址之一令人费解,因为没有真正的格式。这里有几个德国地址示例,说明可能提取此数据的方式。

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 and 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;
        }
    }
}
4

3 回答 3

1

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

于 2013-09-26T13:22:49.520 回答
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üß.]+
于 2013-05-15T08:15:13.123 回答
0

弗拉德邦达连科是对的。

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

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

一个不错的堆栈溢出问题是 如何将自由格式的街道/邮政地址从文本中解析为组件

于 2014-02-24T12:20:42.413 回答