Voornaam en achternaam splitsen dmv hoofdletters
Ik wil graag de voornaam en achternaam kunnen splitsen. Is het met PHP mogelijk om de hoofdletters als achternaam te herkennen, en de normale tekst als voornaam?
JANSEN Jan (voornaam Jan, achternaam Jansen)
PIETERSEN Piet (voornaam Piet, achternaam Pietersen)
DE HAAN Henk (voornaam Henk, achternaam De Haan)
JANSEN Jan (voornaam Jan, achternaam Jansen)
PIETERSEN Piet (voornaam Piet, achternaam Pietersen)
DE HAAN Henk (voornaam Henk, achternaam De Haan)
Sla voorletters, voornaam (roepnaam), tussenvoegsel(s) en achternaam (en wellicht ook naam van de partner ingeval het een vrouw betreft) gewoon apart op, dan heb je dit probleem nooit. Er zijn altijd randgevallen waarbij een systeem de verkeerde keuzes maakt, beter is gewoon om je informatie ondubbelzinnig op te slaan.
Gewijzigd op 18/12/2015 15:27:21 door Thomas van den Heuvel
Aan de andere kant, als ik in een formulier mijn naam moet opgeven, dan geef ik dat goed op.
Apart voorletters, voornaam, achternaam, meisjesnaam (heb ik niet) opgeven is echt vervelend.
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.
Indien de achternaam volledig in uppercase is geschreven dan is dat wel mogelijk denk ik, maar als je je data al in verschillende vakjes hebt opgeslagen, ben je dan niet je eigen data aan het reverse-engineeren? Mogelijk zou je een soort van autocomplete dingetje kunnen maken met AJAX? Maar dan het volgende:
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.
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
De theoretische problemen ken ik wel, maar daar verwacht ik geen problemen mee.
Rest de vraag: Kan je een naam splitsen op basis van hoofdletters?
Rest de vraag: Kan je een naam splitsen op basis van hoofdletters?
mag ik stellen dat de achternaam mogelijk niet alleen uit hoofdletters bestaat?
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"
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
Dat recept werkt aardig goed. Ik ben al een heel stuk opgeschoten met wat ik wil, maar aangezien ik niet heel ervaren ben met PHP loop ik een beetje vast. Ik kan dus wel controleren of elk part uit hoofdletters bestaat, maar hoe kan ik dat vervolgens samenvoegen tot een voornaam en een achternaam?
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>";}
}
?>
Ik denk aan iets als
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:
kan wat efficiënter als je ervanuit gaat dat zodra een voornaam gevonden is, de rest ook voornaam is.
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].
Om te bepalen of een woord uit hoofdletters bestaat kan je ook ctype_upper gebruiken.
Dus na de explode, kan je die functie gebruiken.
Om de voor en achternaam te bepalen.
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.




