Prüfen, ob in einem String Zahle(en) vorkommen


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

tklustig

Erfahrenes Mitglied
#1
Hallo Leute,
folgender Code soll mir eigentlich aufzeigen, ob in einer Strasse eine Hausnummer vorkommt, oder nicht. Der Code ist allerdings insofern ineffizient, als dass er bei Nummereingaben, die mit einem Buchstaben versehen sind (z.B. Große Hamburger Allee 12A) versagt. Wie geht's besser?
PHP:
  //Die Überprüfung der Strasse auf eine Hausnummer ist noch ineffizient
            $string2Array = explode(' ', $modelKunde->strasse);
            for ($i = 0; $i < count($string2Array); $i++) {
                if(!(count($string2Array)>1)){
                    $bool=false;
                    break;
                }
                if ($i == count($string2Array) - 1 && is_numeric($string2Array[$i]))
                    $bool = true;
                else
                    $bool = false;
                /*var_dump($i);
                var_dump($string2Array[$i]);
                var_dump($bool);*/
            }
            if (!$bool) {
                $message = "Die Strasse enthält keine vom Namen abgesonderte Hausnummer.";
                $this->message($message);
                return $this->render('create', ['model' => $model, 'modelKunde' => $modelKunde, 'id' => $id]);
            }
 
Zuletzt bearbeitet:

Sprint

Erfahrenes Mitglied
#2
Du könntest alles ausfiltern, was nicht Zahl ist. So filtere ich z.B. alles aus, was bei Formularen oder GET Übergaben evtl. eingeschmuggelt werden soll.
Code:
$rest = preg_replace("/[^0-9]/im", "", $string);
Hiermit würden alle Zahlen in $rest gesammelt. Ist es leer, fehlt die Hausnummer.
 

Sempervivum

Erfahrenes Mitglied
#3
Oder mit preg_match:
Code:
        $test = [
            'hamburger str. ', 'hamburger str. 52', 'hamburger straße 52a', 'hamburger straße 1c'
        ];
        $pattern = '/\d+[a-zA-Z]*/';
        foreach ($test as $item) {
            $result = preg_match($pattern, $item, $matches);
            if ($result) echo $item . ' enthält eine Hausnummer';
            else echo $item . ' enthält keine Hausnummer';
            var_dump($matches);
        }
 

Yaslaw

n/a
Moderator
#5
NOch ein Tipp. Ich würde Sempervivums Pattern noch erweitern, damit auch die Musterstrasse 13 A und Musterstrasse 14-B gefunden wird.
Die Qualität der Namen hängt vom Erfasser ab.
Code:
/(\d+)[\s\-]*([a-zA-Z]*)/
Dank den Klammern, kannst ud nachher gleich die Nummer standartisieren
PHP:
<pre>
<?php
$test = [
'hamburger str. ', 'hamburger str. 52', 'hamburger straße 52a', 'hamburger straße 1-c', 'hamburger straße 1 D'
    ];
$pattern = '/(\d+)[\s\-]*([a-z]*)/i';
foreach ($test as $item) { 
    echo "Original: {$item}\n";
    if(preg_match($pattern, $item, $matches)) echo "\tEnthält die nummer :{$matches[1]}{$matches[2]}\n";
    echo "Standartisiert: ".preg_replace($pattern, '$1$2', $item)."\n\n";
}
?>
</pre>
Code:
Original: hamburger str. 
Standartisiert: hamburger str. 

Original: hamburger str. 52
	Enthält die nummer :52
Standartisiert: hamburger str. 52

Original: hamburger straße 52a
	Enthält die nummer :52a
Standartisiert: hamburger straße 52a

Original: hamburger straße 1-c
	Enthält die nummer :1c
Standartisiert: hamburger straße 1c

Original: hamburger straße 1 D
	Enthält die nummer :1D
Standartisiert: hamburger straße 1D
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…