【问题标题】:PHP, extracting mailing addressPHP,提取邮寄地址
【发布时间】:2013-05-15 08:10:57
【问题描述】:

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

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% 的时间,zip/city 工作 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;
        }
    }
}

【问题讨论】:

  • 如果你每次都想要一个可靠的结果,那就不要了。
  • 格式几乎是 firstname lastname newline street newline zipcode city 所以你不应该有太多的问题与正则表达式匹配。此外,检查 HTML 是否足够语义以使用 DOM 解析器。
  • 我是使用正则表达式的新手(因为它已被弃用),我听说有更好的选择,但我找不到。我怎样才能有效地使用正则表达式来实现这个目标?

标签: php html regex pattern-matching


【解决方案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üß.]+

【讨论】:

  • 如果我的地址字符串是整个网站的内容(file_get_contents)怎么办?我也只需将 '/([0-9]+) ([A-Za-z]+)/' 替换为 [A-Za-züß.]+ [A-Za-z.üß]+\s[ AZZ。 0-9ß-]+\s[0-9]+ [A-Za-züß.]+?
  • 所以我想没有什么好的方法可以完成这个任务...?
  • 不管它是什么。 file_get_contents() 获取字符串,而 preg_match 适用于重要的字符串。要获取网站,我建议您使用 curl 而不是 file_get_contents()
  • 不确定您是否看到我对原始问题的编辑,但我有一些工作,只是无法正确获得街道......
  • 所以请提供您拥有这些街道的网站内容,我们可以更正正则表达式
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    弗拉德·邦达连科是对的。

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

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

    一个不错的堆栈溢出问题是How to parse freeform street/postal address out of text, and into components

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多