2013-05-15 3 views
0

У меня возникла проблема в том, что мне нужна помощь в исправлении. Я пытаюсь создать скрипт, который сканирует веб-сайты для почтовых адресов. В основном немецкие адреса, но я не уверен, как создать указанный скрипт, я уже создал один, который извлекает адреса электронной почты с указанных сайтов. Но адрес один вызывает недоумение, потому что нет реального формата. Вот несколько немецких адресов для примеров, чтобы извлечь эти данные.PHP, извлечение почтового адреса

Ilona Mustermann 
Hauptstr. 76 
27852 Musterheim 


Andreas Mustermann 
Schwarzwaldhochstraße 1 
27812 Musterhausen 


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

Это всего лишь несколько примеров того, что я хочу извлечь из веб-сайтов. Возможно ли это с PHP?

Edit:

Это то, что я до сих пор

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

Он работает, чтобы получить $ Имя (IE: Илона Mustermann и Город/почтовый индекс (27852 Musterheim), но не уверены в регулярном выражении, чтобы всегда получить улицы?


Ну это то, что я придумал до сих пор, и это, кажется, работает около 60% времени на улицах, почтовый индекс/город работать на 100% и так же имя. Но когда он пытается o добывать улицу, иногда это терпит неудачу. Любая идея, почему?

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; 
     } 
    } 
} 
+1

Нет, если вы хотите надежный результат каждый раз. – Anigel

+0

Формат в значительной степени является первым именем lastname newline street newline zipcode city, поэтому у вас не должно быть слишком много проблем, соответствующих этому регулярному выражению. Кроме того, проверьте, достаточно ли HTML достаточно семантически для использования DOM Parser. – Gordon

+0

Я новичок в использовании регулярных выражений (потому что он устарел), я слышал, что есть лучшие альтернативы, но я не мог его найти. Как я могу эффективно использовать regex для достижения этой цели? – Richard

ответ

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üß.]+ 
+0

Что делать, если моя адресная строка является содержимым всего веб-сайта (file_get_contents), будет ли это работать? Также я просто заменю '/ ([0-9] +) ([A-Za-z] +) /' на [A-Za-züß.] + [A-Za-z.üß] + \ s [ A-Za-Z. 0-9ß -] + \ s [0-9] + [A-Za-züß.] +? – Richard

+0

Итак, я думаю, что нет хорошего способа выполнить эту задачу ...? – Richard

+0

Не важно, что это такое. file_get_contents() получает строку и preg_match работает над строками, что имеет значение.Чтобы получить сайт, я предлагаю вам использовать завиток вместо file_get_contents() – Robert

1

Невозможно получить надежный ответ с регулярным выражением с такой сложной строкой. Это единственный правильный ответ на этот вопрос.

0

Влад Бондаренко находится справа.

В CS говорят: Почтовые адреса не образуют обычный язык.

Извлечение информации является активной темой исследования. Регулярные выражения не являются полностью фиктивными, но будут иметь более высокую частоту отказов, чем подходы, которые используют словари («географические указатели») или более сложные алгоритмы машинного обучения.

Хороший переполнение стека д/а How to parse freeform street/postal address out of text, and into components

Смежные вопросы