[PHP] Namen van personen netjes formatteren

Pagina: 1
Acties:
  • 212 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben niet zo bijster handig met RexExen, maar ik probeer een functie te maken die Nederlandse namen netjes weergeeft.

Voorbeeld
dick van stam -> Dick van Stam
DICK STAM -> Dick Stam
diCK vAn DEr StAM -> Dick van der Stam

Ik ben al een eindje, maar het wil me niet zo goed lukken om het eerst teken van een string uppercase te krijgen en de loop om de tussenvoegsels lowercase te maken krijg ik ook niet echt goed.

Iemand tips?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?

$string = "dick van stam";

$tussens = array("van","der","vd","v/d","de");

foreach( $tussens as $tus )
{
    $string = preg_replace ("/$tus/se" ,"''.strtlower('$tus')" , $string ); 
}
$string = preg_replace ("/(\s[a-z])/se" ,"''.strtoupper('\\1')" , $string ); 

print "Naam: $string";

?>

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Waarom doe je dit met een regex? Kun je niet beter werken met explode op " " en dan met strtolower(ucfirst('een woord van de naam')) ucfirst(strtolower('een woord')) de juiste woorden een hoofdletter geven.

Je hebt de functienaam: strtlower trouwens verkeerd: strtolower. Heb je error_reporting wel op E_ALL staan?

[ Voor 60% gewijzigd door djluc op 08-10-2003 17:26 ]


Acties:
  • 0 Henk 'm!

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 15-09 17:06
Als je nu split op de spatie, dan ieder element van die array eerst compleet lowercased en daarna de eerste letter van dat element uppercased, en daarna die array terug aan mekaar plakt heb je wat je bedoelt. Anders zet je 'r nog een check in voor woorden als 'van' als die niet met hoofdletter moeten.

En in koor, bedankt djluc voor de namen van de functies ;).

djluc, niet getest ofzo, maar zou je best niet eerst alles loweren en daarna de eerste letter upperen? Anders ga je eerst de eerste letter upperen en daarna alles terug loweren, klopt niet ;).

[ Voor 32% gewijzigd door coubertin119 op 08-10-2003 17:24 ]

Skat! Skat! Skat!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Dat is inderdaad de juiste volgorde :o ach ja het idee is duidelijk lijkt mij ;)

Onderstaande post is zo'n beetje hetzelfde als in de 2 posts hierboven. Voor diegenen die dat nog niet helemaal begrepen hadden >:)

[ Voor 46% gewijzigd door djluc op 08-10-2003 17:27 ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 17-09 16:59

Johnny

ondergewaardeerde internetguru

Ik zou eerst de gehele naam naar lowercase doen.

Dan de naam opsplitsen naar een array met explode(" ", $string)

Doorloop de array met een loop.

Geef alle woorden die niet matchen aan $tussens een hoofdletteer met ucfirst()

Plak de array weer aan elkaar met implode()

Edit: ze zijn me weer voor :(

[ Voor 9% gewijzigd door Johnny op 08-10-2003 17:26 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 08 October 2003 @ 17:18:
Ik ben al een eindje, maar het wil me niet zo goed lukken om het eerst teken van een string uppercase te krijgen en de loop om de tussenvoegsels lowercase te maken krijg ik ook niet echt goed.
Als ik dat zo lees heb je nog niks voor elkaar, maar goed ;)

Er is ook een functie ucwords(), die elke 1e letter van een woord 'uppercase't', maar door tussenvoegsels heb je daar niet zoveel aan helaas.

Beste lijkt me, om (zoals djluc zegt) de naam te exploden op een spatie, dan een exclude array te maken met daarin je waarden die niet meegenomen mogen worden (van der, van de, van, v/d, enz.). Daarna doorloop je in een foreach loopje de geexplode naam, je controleert of de value !in_array($exclude). Misschien is het ook nog even verstanding om te checken of het niet het eerste, of het laaste element uit de naam array is.

De code hiervoor is behoorlijk simpel, maar door die weg te geven verpest ik jouw plezier :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okee ik heb nu dit. Alleen zit ik nog even te kijken waarom hij van,der,de niet oppakt.

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
29
$string = "dick van stam";

$string = strtolower( $string );
$words = explode( " " , $string );


$n = 1;

foreach( $words as $word )
{
    if( $n != 1 ) // Spatie ervoor als het niet het eerste woord is.
    {
        $nice_name .= " ";
    }
    
    if( $word != "van" | $word != "der" | $word != "de" )
    {
        $nice_name .= ucwords( $word );
    }
    
    else
    {
        $nice_name .= $word;
    }
    $n++;
}


print "Naam: $nice_name";

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 08 October 2003 @ 17:48:
PHP:
1
2
3
4
5
6
7
foreach( $words as $word )
{
    if( $word != "van" | $word != "der" | $word != "de" )
    {
        $nice_name .= ucwords( $word );
    }
}
Evalueert altijd naar true, behalve als $word == "van" && $word == "der" && $word == "de"
Maak er maar eens if( !( $word == "van" || $word == "der" || $word == "de") )
Echter je maakt je code wel wat statisch zeg maar, http://nl2.php.net/in_array is een betere optie ;)

Acties:
  • 0 Henk 'm!

Verwijderd

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
29
30
31
<?
$string = "dick van stam"; 

$string = strtolower( $string ); 
$words = explode( " " , $string ); 


$n = 1; 

foreach( $words as $word ) 
{ 
    if( $n != 1 ) // Spatie ervoor als het niet het eerste woord is. 
    { 
        $nice_name .= " "; 
    } 
     
    if( ($word != "van") and ($word != "der") and ($word != "de") ) 
    { 
        $nice_name .= ucwords( $word ); 
    } 
     
    else 
    { 
        $nice_name .= $word; 
    } 
    $n++; 
} 


print "Naam: $nice_name";
?> 


Probeer deze code maar eens. Deze werkt gegarandeerd 8).

De clue is dat jij keek OF het woord de, het of een is. Maar de conditie voor de uitvoer van ucfirst is dat het wordt niet gelijk is aan de EN aan van EN aan der.

Het zou trouwens beter zijn wanneer je de woordjes in een array pleurt en met behulp van in_array kijkt of het woord in de array staat. Zo niet, dan een ucfirst anders gewoon het woord erachter plakken.

Dit maakt het toevoegen van extra worden korter, duidelijker en simpeler.

[ Voor 5% gewijzigd door Verwijderd op 08-10-2003 17:59 . Reden: Glimi was me voor :7 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank voor de hulp. Dit is hem dus geworden.

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
29
30
$string = "dick van stam";
$between_words = array("van","der","de");

$string = strtolower( $string );
$words = explode( " " , $string );


$n = 1;

foreach( $words as $word )
{
    if( $n != 1 ) // Spatie ervoor als het niet het eerste woord is.
    {
        $nice_name .= " ";
    }
    
    if( !in_array( $word , $between_words) )
    {
        $nice_name .= ucwords( $word );
    }
    
    else
    {
        $nice_name .= $word;
    }
    $n++;
}


print "Naam: $nice_name";

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Ik haal even regex uit de titel want dat is misschien wel makkelijk voor de search ;)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Jammer dat je die laatste print dan weer niet mooi uitvoert:variablen binnen quotes 8)7

Krijg je trouwens geen foutmelding als je $nice_name.= doet terwijl die variable nog niet eens bestaat? Volgens mij heb je error_reporting echt anders staan dan ik heb...

[ Voor 3% gewijzigd door djluc op 08-10-2003 18:11 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
djluc schreef op 08 October 2003 @ 18:11:
Jammer dat je die laatste print dan weer niet mooi uitvoert:variablen binnen quotes 8)7
Mooi is een variabel iets. Het is gewoon een normale PHP constructie, welke in 99% van de gevallen geen problemen oplevert, dus waarom het zo extreem lelijk is dat het ab!so!luut vermeden moet worden zie ik niet echt :)

edit:
Shit, quote ik de verkeerde line.... excuus :o

[ Voor 28% gewijzigd door Glimi op 08-10-2003 18:50 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Deze code:
PHP:
1
2
3
4
<?PHP
$i.='ok';
echo $i;
?>
Notice: Undefined variable: i in c:\phpdev\www\test.php on line 2
ok
Ik zal het dus niet zo doen :)

Waar baseer jij jouw quote eigenlijk op? Dat mooi is inderdaad variabel, maar sloeg op hetgeen na de dubbele punt, de variable binnen de quotes. Jouw quote gaat over het probleem, zoals beschreven in de bovenstaande code.

Acties:
  • 0 Henk 'm!

  • darkrain
  • Registratie: Augustus 2001
  • Laatst online: 16:06

darkrain

Moderator Discord

Geniet

@ djluc: Volgens mij hoef je in PHP je variabelen niet te definieren.

Daarom is die fout ook een notice en geen echte fout.

Tweakers Discord


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Wat als je achternaam Van is? Of Der? Of je voornaam Van?

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Dark_Rain schreef op 09 oktober 2003 @ 08:05:
@ djluc: Volgens mij hoef je in PHP je variabelen niet te definieren.

Daarom is die fout ook een notice en geen echte fout.
Een notice is ook een fout. ;) PHP gaat nog wel gewoon verder, maar in vrijwel elke andere taal _moet_ je variabelen declareren voor je ze gebruikt, iets wat wel zo netjes is. Het is gewoon een kwestie van jezelf aanleren. :)
PHP:
1
2
3
$i = ''; // al voldoende in PHP
$i.='ok';
echo $i;

Sundown Circus


Acties:
  • 0 Henk 'm!

  • darkrain
  • Registratie: Augustus 2001
  • Laatst online: 16:06

darkrain

Moderator Discord

Geniet

Ik vind $i = ''; geen declareren.

Maar goed als PHP dan niet meer die notice geeft zal ik dat in het vervolg ook maar gebruiken.

Toch vind ik declareren meer iets van var $i as int ofzo.

Tweakers Discord


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Dark_Rain schreef op 09 October 2003 @ 10:03:
Ik vind $i = ''; geen declareren.

Maar goed als PHP dan niet meer die notice geeft zal ik dat in het vervolg ook maar gebruiken.

Toch vind ik declareren meer iets van var $i as int ofzo.
Dat ben ik met je eens. Ik vind C-style declaraties en variabelen (dus zonder $ ervoor) wel mooi, a la: int anInt; . Maar ja ik ben niet de schrijver van PHP, dus ik kan er verder ook weinig aan doen. :P

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
RedRose schreef op 09 oktober 2003 @ 09:57:
Een notice is ook een fout. ;) PHP gaat nog wel gewoon verder, maar in vrijwel elke andere taal _moet_ je variabelen declareren voor je ze gebruikt, iets wat wel zo netjes is. Het is gewoon een kwestie van jezelf aanleren. :)
Als het een fout is, waarom verplicht PHP het dan niet? Waarom knalt de PHP interpetender er dan niet gewoon keihard uit als het een fout is?

De reden dat PHP er een notice voor geeft is, is dat je wel eens door een typo toekenningen doet aan onbedoelde variabelen. Bijvoorbeeld:
PHP:
1
2
$l_foo = 20;
++$l_foO;

PHP kan het namelijk geen bal interesseren of jij een variabele wel of niet declareert, omdat hij toch geen garanties aan neemt over het type en de bewerkingen daarvan, tot runtime.

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Glimi schreef op 09 October 2003 @ 12:06:
[...]

Als het een fout is, waarom verplicht PHP het dan niet? Waarom knalt de PHP interpetender er dan niet gewoon keihard uit als het een fout is?
Ik bedoelde dat ik het fout vind. Ik vind dat je variabelen op een nette manier moet initialiseren, om onder andere zelf het overzicht te houden over de gebruikte variabelen en onnodige programmeertijd verspilt.
De reden dat PHP er een notice voor geeft is, is dat je wel eens door een typo toekenningen doet aan onbedoelde variabelen. Bijvoorbeeld:
PHP:
1
2
$l_foo = 20;
++$l_foO;
Een ander,misschien beter, voorbeeld is de 'undefined index'-notice:
PHP:
1
2
$mooh=array();
echo $mooh['splut'];
Daar vind ik het dus wel echt een fout om een index van een array aan te roepen, terwijl deze helemaal niet bestaat.
PHP kan het namelijk geen bal interesseren of jij een variabele wel of niet declareert, omdat hij toch geen garanties aan neemt over het type en de bewerkingen daarvan, tot runtime.
Het hoeft PHP ook geen bal te kunnen schelen, maar de programmeur wel ;) . Bij design-time (of whatever je dat noemt) moet je dit soort dingen eruit halen, omdat PHP het inderdaad niet zoveel uitmaakt als hij gaat interpreteren (aanemende dat je dat bedoelt met 'interpetender'). Dus: het is dan misschien geen fatal error in PHP, maar het is wel een fatal error als je het beschouwt vanuit de programmeer-techniek. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • darkrain
  • Registratie: Augustus 2001
  • Laatst online: 16:06

darkrain

Moderator Discord

Geniet

Daar heb je gelijk in RedRose.

Alleen zie ik niet in waarom je niet gewoon een stukje commentaar achter het eerste gebruik van een variabele kunt zetten waarin je zet wat ie doet.

Dan weet een andere programmeur ook waarover het gaat.

Tweakers Discord


Acties:
  • 0 Henk 'm!

  • Hoppie
  • Registratie: Februari 2001
  • Niet online
Cavorka schreef op 09 oktober 2003 @ 09:49:
Wat als je achternaam Van is? Of Der? Of je voornaam Van?
Is iemand deze opmerking nog opgevallen?
Misschien moet je kijken of de van/der/de als eerste of laatste woord van de naam worden gebruikt. Zoja, dan zal het wel een voor/achternaam zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Hoppie schreef op 09 October 2003 @ 12:39:
[...]

Is iemand deze opmerking nog opgevallen?
Misschien moet je kijken of de van/der/de als eerste of laatste woord van de naam worden gebruikt. Zoja, dan zal het wel een voor/achternaam zijn.
Zoals als ik zei:
Misschien is het ook nog even verstanding om te checken of het niet het eerste, of het laaste element uit de naam array is.

Dat houdt dus in dat het de voor-, of achternaam is, dacht dat jullie die link zelf wel zouden leggen.

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 17-09 16:59

Johnny

ondergewaardeerde internetguru

Als we toch gaan mierenneuken:

ucwords() geeft ieder woord in de string een hoofdletter ucfirst() alleen het eerste woord en zou dus theoretisch gezien sneller moeten zij omdat niet de hele string moet worden doorzocht op spaties.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

* drm gaat ook miereneuken \o/ :P

Er zijn nog veel meer tussenvoegsels te bedenken zoals "di", "in 't", "des", "O'" en je vergeet de "Mac..." en "Mc" namen. Nou vergeet ik ongetwijfeld ook nog een hele hoop :+

Maar echt 100% failsafe krijg je zo'n scriptje nooit, omdat er altijd weer gekke dingen bestaan. Da's net als met straatnamen en huisnummers etc.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Ach, wat dacht je van:
dubbele achternamen (De Vries-Bos, De Vries Bos, oid), dubbele voornamen (HenkJan, Henk-Jan, Henk Jan).

Vind ik geen mierenneuken. :p

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Cavorka:
Ach, wat dacht je van:
dubbele achternamen (De Vries-Bos, De Vries Bos, oid), dubbele voornamen (HenkJan, Henk-Jan, Henk Jan).

Vind ik geen mierenneuken. :p
behalve HenkJan is dat makkelijk op te lossen door te splitten op non-word characters.
preg_split ( '/\W/', $str );

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1