У меня возникла проблема в том, что мне нужна помощь в исправлении. Я пытаюсь создать скрипт, который сканирует веб-сайты для почтовых адресов. В основном немецкие адреса, но я не уверен, как создать указанный скрипт, я уже создал один, который извлекает адреса электронной почты с указанных сайтов. Но адрес один вызывает недоумение, потому что нет реального формата. Вот несколько немецких адресов для примеров, чтобы извлечь эти данные.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;
}
}
}
Нет, если вы хотите надежный результат каждый раз. – Anigel
Формат в значительной степени является первым именем lastname newline street newline zipcode city, поэтому у вас не должно быть слишком много проблем, соответствующих этому регулярному выражению. Кроме того, проверьте, достаточно ли HTML достаточно семантически для использования DOM Parser. – Gordon
Я новичок в использовании регулярных выражений (потому что он устарел), я слышал, что есть лучшие альтернативы, но я не мог его найти. Как я могу эффективно использовать regex для достижения этой цели? – Richard