Voornaam en achternaam splitsen dmv hoofdletters

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

G Jansma

G Jansma

18/12/2015 15:01:27
Quote Anchor link
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)
 
PHP hulp

PHP hulp

25/12/2024 07:28:36
 
Thomas van den Heuvel

Thomas van den Heuvel

18/12/2015 15:23:49
Quote Anchor link
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
 
Eddy E

Eddy E

18/12/2015 15:29:07
Quote Anchor link
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.
 
G Jansma

G Jansma

18/12/2015 15:29:16
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/12/2015 16:22:01
Quote Anchor link
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.
Gewijzigd op 18/12/2015 16:23:24 door Thomas van den Heuvel
 
G Jansma

G Jansma

18/12/2015 16:52:30
Quote Anchor link
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?
 
Ivo P

Ivo P

18/12/2015 17:20:49
Quote Anchor link
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"
 
Thomas van den Heuvel

Thomas van den Heuvel

18/12/2015 17:45:34
Quote Anchor link
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
 
G Jansma

G Jansma

18/12/2015 20:24:45
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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>";}
}


?>
 
Ivo P

Ivo P

18/12/2015 21:54:56
Quote Anchor link
Ik denk aan iets als

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
  preg_match('#(^[^a-z]+)\b(.*)$#', $name, $aMatches);
?>


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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>


kan wat efficiënter als je ervanuit gaat dat zodra een voornaam gevonden is, de rest ook voornaam is.
 
G Jansma

G Jansma

19/12/2015 17:01:43
Quote Anchor link
Heel erg bedankt! Het moest alleen $parts[$i] zijn in plaats van $part[$i].
 
Randy vsf

Randy vsf

19/12/2015 21:54:07
Quote Anchor link
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.
 
Marthijn Buijs

Marthijn Buijs

19/12/2015 23:37:14
Quote Anchor link
Je kan ook enkel explode doen en dan uit die array de laatste waarde pakken.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.