[regex] Probleem met regex van Voor- en achternaam

Pagina: 1
Acties:
  • 1.452 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • Quibus
  • Registratie: November 2000
  • Laatst online: 01-10 10:47
Ik ben dus bezig om wat regexen te schrijven voor een formuliertje op mijn webpagina. Dit gebeurd allemaal in PHP. Bij de regex van voor- en achternaam heb ik helaas een probleem. Mijn regex gaat als volgt:
code:
1
2
3
4
5
^ // begin string
[A-Za-z'ÀÁÂÃÄÅÇÈÉÊËÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäèéçêëìíîïòóôõöùúûü-]{2,} //naam van meer dan 2 karakters lang
\s{1} // er moet 1 spatie komen
([A-Za-z'ÀÁÂÃÄÅÇÈÉÊËÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäçèéêëìíîïòóôõöùúûü-]+|\s{1})+ //hier komt het probleem
$ // eind string

Het probleem zit hem in het laatste stukje van de regex. namen zoals: "Jan Korteachternaam" zijn heel makkelijk te controleren.
MAar als ik nu een naam heb zoals: "Puk van de Petteflat" dan heb ik een probleem. In de regex die ik nu heb werkt dit wel, maar je kunt meer dan 1 spatie ingeven.. bv. "Puk van de Petteflat". Als ik naar het laatste stukje van mijn regex kijk is dit ook niet zo verwonderlijk(kijk naar de + op het eind). Ik weet alleen niet hoe ik dit probleem moet oplossen. Ik wil dus dat ik namen zoals bv "Puk van de Petteflat" kan controleren, maar men mag dan wel maar één spatie tussen de voorvoegsels gebruiken (er mogen zo veel voorvoegsels zijn als je wilt)
Kan iemand mij helpen?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Kan je niet beter aparte invoervelden geven zodat de gebruiker zelf de naam goed (die zal het toch het beste weten ;) ) op kan splitsen.

Want wat doe je met 'Diederik Jan Peter van de Ploeg' oid? :P

Acties:
  • 0 Henk 'm!

  • Quibus
  • Registratie: November 2000
  • Laatst online: 01-10 10:47
Op donderdag 06 juni 2002 21:35 schreef ACM het volgende:
Want wat doe je met 'Diederik Jan Peter van de Ploeg' oid? :P
Ja precies, daarom heb ik dat laatste stukje ook uit mijn Regex, alleen kan ik hier zoveeel spaties ingeven als ik wil. Ik zoek als laatste stukje van mijn regex, een code die kijkt of je te maken hebt met wat karakters (bv "van" "de" "Ploeg" iig alles wat achternaam kan zijn) óf één spatie.

2 velden vind ik trouwens een beetje het probleem verschuiven. Als je dan als achternaam hebt: "Van der Ploeg van hier tot Ginder". Heb je nog steeds het zelfde probleem.

Acties:
  • 0 Henk 'm!

  • Xlnt
  • Registratie: Oktober 2000
  • Laatst online: 28-09 10:21
Probeer dit eens:
code:
1
2
3
4
5
6
7
8
9
^ // 1*
([A-Za-z'ÀÁÂÃÄÅÇÈÉÊËÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäèéçêëìíîïòóôõöùúûü-]{2,}\s)+ // 2*
[A-Za-z'ÀÁÂÃÄÅÇÈÉÊËÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäçèéêëìíîïòóôõöùúûü-]+ // 3*
$ // 4*

1: begin string
2: naam of tussenvoegsel van minimaal 2 karakters met spatie voor naar het volgende woord
3: achternaam
4: eind string

Ik gebruik daar overigens dit voor:
code:
1
^(\S+\s)+\S+$

Want stel je voor er is wél iemand met een naam van één letter >:).

"It's not that I'm lazy. It's that I just don't care."


Acties:
  • 0 Henk 'm!

  • Quibus
  • Registratie: November 2000
  • Laatst online: 01-10 10:47
Cool Xlnt,
Dit werkt echt perfect. En is nog simpel ook.

Acties:
  • 0 Henk 'm!

  • btweaked
  • Registratie: November 2011
  • Laatst online: 04-10-2021
Ik heb deze gemaakt, werkt voor mij:

function SplitNaam($naam, &$voornaam, &$achternaam) {
$naam = preg_replace('/(\s?\-\s?)/i', '-', $naam);
preg_match('/^(.+?)\s((van |op |in |klein )?(de |der |den |het )?)(\S+)$/i', $naam, $pm);
$voornaam = ucwords($pm[1]);
$achternaam = str_replace(" klein ", " Klein ", strtolower($pm[2])) . ucwords($pm[5]);
}

Aanroep:

$voornaam = "";
$achternaam = "";
SplitNaam("Diederik Jan Peter van de Ploeg", $voornaam, $achternaam);
echo "Voornaam: [" . $voornaam . "]<br/>";
echo "Achternaam: [" . $achternaam . "]";

Output:

Voornaam: [Diederik Jan Peter]
Achternaam: [van de Ploeg]

Als je tussenvoegsels los wilt hebben:

function SplitNaam2($naam, &$voornaam, &$tussenvoegsels, &$achternaam) {
$naam = preg_replace('/(\s?\-\s?)/i', '-', $naam);
preg_match('/^(.+?)\s((van |op |in |klein )?(de |der |den |het )?)(\S+)$/i', $naam, $pm);
$voornaam = ucwords($pm[1]);
$tussenvoegsels = trim(str_replace(" klein ", " Klein ", strtolower($pm[2])));
$achternaam = ucwords($pm[5]);
}

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-10 23:36

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wow, kick van een topic van 19 jaar oud is ook wel een beetje overdreven ;).

En voor het vervolg: zet code alsjeblieft in code tags.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1

Dit topic is gesloten.