Voornaam en achternaam splitsen dmv hoofdletters
JANSEN Jan (voornaam Jan, achternaam Jansen)
PIETERSEN Piet (voornaam Piet, achternaam Pietersen)
DE HAAN Henk (voornaam Henk, achternaam De Haan)
Gewijzigd op 18/12/2015 15:27:21 door Thomas van den Heuvel
Apart voorletters, voornaam, achternaam, meisjesnaam (heb ik niet) opgeven is echt vervelend.
Ik heb in de database de velden gesplitst, maar ik wil uitslagen toevoegen waarin deze vorm wordt gebruikt. In het geval dat iemand nog geen id heeft wil ik deze toevoegen, en daarom wil ik graag voornaam en achternaam kunnen onderscheiden.
En als je een naam invoert zou dan bepaald moeten worden (aan de hand van deze naam) of deze al in je database zit? De naam is mogelijk niet uniek, mogelijk zelfs niet in combinatie met geboortedatum. Deze discussie (van het uniek zijn van persoonsgegevens) komt mij trouwens bekend voor. De kans is (heel?) klein, maar nog steeds aanwezig dat verschillende personen in jouw systeem op deze manier worden aangezien voor eenzelfde persoon.
Het komt een beetje over alsof je een makkelijke (luie?) oplossing zoekt voor iets, maar mogelijk introduceer je daarmee weer andere problemen. Ook geeft je nauwelijks een omschrijving van de setting waarin je dit principe wilt toepassen wat het haast onmogelijk maakt een inschatting te geven van de implicaties van (ontwerp)beslissingen.
Gewijzigd op 18/12/2015 16:23:24 door Thomas van den Heuvel
Rest de vraag: Kan je een naam splitsen op basis van hoofdletters?
In je voorbeeld geef je al een met een spatie erin. En ik kan me ook nog koppeltekens, apostroph en accentletters voorstellen.
Beter zoek je misschien op "geen kleine letters"
G Jansma op 18/12/2015 16:52:30:
De theoretische problemen ken ik wel, maar daar verwacht ik geen problemen mee.
Denk hier de stem van Darth Vader bij: Do not underestimate the ingenuity of (stupid) users.
G Jansma op 18/12/2015 16:52:30:
Rest de vraag: Kan je een naam splitsen op basis van hoofdletters?
Natuurlijk kan dat, maar dat lijkt mij een oversimplificatie / nogal foutgevoelig.
Hier een recept wat doet wat jij wilt:
- explode een naam op een spatie
- controleer of een deel bestaat uit enkel hoofdletters (of andere karakters, zie Ivo zijn kanttekeningen), gebruik hiervoor bijvoorbeeld een regexp
- is dit het geval: dit deel is onderdeel van de achternaam, zo niet: dan niet
Gewijzigd op 18/12/2015 17:48:32 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$name = "AAA BBB CCC Ddd Eee Fff";
$parts = explode(" ", $name);
$count = count($parts);
echo '<pre>'.print_r($parts, true).'</pre>';
for($i = 0; $i < $count; $i++ ) {
echo $parts[$i];
if (strtoupper($parts[$i]) == $parts[$i]) {echo " ".$i." Hoofdletters <br>";} else { echo " ".$i." Geen hoofdletters <br>";}
}
?>
$name = "AAA BBB CCC Ddd Eee Fff";
$parts = explode(" ", $name);
$count = count($parts);
echo '<pre>'.print_r($parts, true).'</pre>';
for($i = 0; $i < $count; $i++ ) {
echo $parts[$i];
if (strtoupper($parts[$i]) == $parts[$i]) {echo " ".$i." Hoofdletters <br>";} else { echo " ".$i." Geen hoofdletters <br>";}
}
?>
dus
vanaf het begin ^
alle tekens die maar geen lower case zijn (nb valt een ö hieronder?) [^a-z]+
gevolgd door een word boundry (\b) kan ook een spatie zijn? \s
de rest is dan automatisch de achternaam(en)
Toevoeging op 18/12/2015 21:58:27:
voor jouw script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$name = "AAA BBB CCC Ddd Eee Fff";
$parts = explode(" ", $name);
$count = count($parts);
echo '<pre>'.print_r($parts, true).'</pre>';
$voornaam = '';
$achternaam = '';
for($i = 0; $i < $count; $i++ ) {
echo $parts[$i];
if (strtoupper($parts[$i]) == $parts[$i]) {
echo " ".$i." Hoofdletters <br>";
$achternaam .= ' '. $part[$i];
}
else {
echo " ".$i." Geen hoofdletters <br>";
$voornaam .= ' '. $part[$i];
}
}
$achternaam = trim($achternaam);
$voornaam = trim($voornaam);
?>
$name = "AAA BBB CCC Ddd Eee Fff";
$parts = explode(" ", $name);
$count = count($parts);
echo '<pre>'.print_r($parts, true).'</pre>';
$voornaam = '';
$achternaam = '';
for($i = 0; $i < $count; $i++ ) {
echo $parts[$i];
if (strtoupper($parts[$i]) == $parts[$i]) {
echo " ".$i." Hoofdletters <br>";
$achternaam .= ' '. $part[$i];
}
else {
echo " ".$i." Geen hoofdletters <br>";
$voornaam .= ' '. $part[$i];
}
}
$achternaam = trim($achternaam);
$voornaam = trim($voornaam);
?>
kan wat efficiënter als je ervanuit gaat dat zodra een voornaam gevonden is, de rest ook voornaam is.
Heel erg bedankt! Het moest alleen $parts[$i] zijn in plaats van $part[$i].
ctype_upper gebruiken.
Dus na de explode, kan je die functie gebruiken.
Om de voor en achternaam te bepalen.
Om te bepalen of een woord uit hoofdletters bestaat kan je ook Dus na de explode, kan je die functie gebruiken.
Om de voor en achternaam te bepalen.
Je kan ook enkel explode doen en dan uit die array de laatste waarde pakken.