strtoupper van initialen - kan dit met minder code?

Status
Niet open voor verdere reacties.

SchoutenCC

Gebruiker
Lid geworden
23 jul 2008
Berichten
14
Hallo,

Gegeven een variabele $username waarvan niet a priori bekend is of deze in uppercase, lowercase of mixed case is (en die case insensitive is van input maar case sensitive van output) wil ik een deel van deze string uppercasen.

Specifiek: er komt een username binnen die kan zijn a.b.c.achternaam, A.B.C.ACHTERNAAM of A.b.c.achternaam of weet ik welke variant. De authenticatie is case insensitive, dus alle varianten zjin correct. De applicatie waar het heengaat is echter case sensitive dus het moet een vaste opmaak hebben waarbij de initialen (incl. eerste letter achternaam) gecapitaliseerd zijn, oftewel: A.B.C.Achternaam.

Mijn poging (werkend):
Code:
// SchoutenCC enhancement: capitalize initials in $username
$username = strtolower($username);
$pos = strrpos($username, '.') + 2;
$username = strtoupper(substr($username, 0, $pos)) . substr($username, $pos);

Ik vind het alleen iets te uitgebreid, dit moet korter kunnen, liefst in 1 statement. Is hier wellicht een php-guru die hierover kan adviseren?

Alvast bedankt,
Chris
 
Niet alles hoeft in 1 statement. Dit lijkt me precies het soort dingen waar die code in een functie zetten de oplossing is.
 
Normaal gesproken zou ik je 100% gelijk geven met het oog op hergebruik. Dit is echter een situatie waarbij de aanroep exact 1x plaatsvindt en het een modificatie betreft in een willekeurige (externe) webapplicatie (h.l. MediaWiki na integratie met CAS). Daarom zou ik het zo kort mogelijk willen hebben.

Gaat het niet, dan gaat het niet, maar ik had zomaar het vermoeden dat ik (als php-ongeïnitieerde) een obvious functie over het hoofd zag :)

Chris
 
Als ie er is, ken ik em ook niet. Persoonlijk zou ik het gewoon zo laten staan, en als je het later op meer plekken nodig hebt er alsnog een functie van maken.
 
Dit zou mijn oplossing worden.
PHP:
$usertemp = explode('.', $username);
$username="";
for ($i=0; $i < ($usertemp[count($usertemp)]-1); $i++)
{
	$username += strtoupper($usertemp[$i]).".";
}
$username += ucfirst(strtolower($usertemp[count($usertemp)]));

Dat ik het met een loop doe is met name omdat ik bekent ben met strrpos($username, '.') + 2.
 
Ervan uitgaande dat de initialen altijd bestaan uit 1 enkele letter gevolgd door een punt, en een achternaam uit een enkele naam bestaat (en dus geen spaties, streepjes of anders symbolen):

PHP:
echo preg_replace("/^(([A-z]\.)+)([A-z]+)/e", "strtoupper('\\1').ucfirst('\\3')",  $username);

Met de e moderator in preg_replace geef je aan dat de replace string (het tweede argument) geavalueerd wordt als php. Je gebruikt dan \\# als backreference.

Er zullen waarschijnlijk aanpassingen moeten komen aan de regexp als je bijvoorbeeld spaties en streepjes in de achternaam toe wil staan. De namen achter een spatie of koppelteken moeten dan ook gematcht worden en ucfirst ondergaan.
 
Laatst bewerkt:
Ervan uitgaande dat de initialen altijd bestaan uit 1 enkele letter gevolgd door een punt, en een achternaam uit een enkele naam bestaat ...
  • Ferd. E. Baron van Apen tot Staart
  • P. den Hartog
  • P.D. Hartog
  • P. van Geel
  • P van Geel
  • P. v. Geel
  • P.V. Geel (pieter victor geel)
  • C.J. Dichter-van Verre
  • C. J. Dichter - van Verre
? ;)
Lastige dingen!
 
  • Ferd. E. Baron van Apen tot Staart
  • P. den Hartog
  • P.D. Hartog
  • P. van Geel
  • P van Geel
  • P. v. Geel
  • P.V. Geel (pieter victor geel)
  • C.J. Dichter-van Verre
  • C. J. Dichter - van Verre
? ;)
Lastige dingen!

Daarom zeg ik dat ik bij deze regexp alleen uitga van de parameters die Chris gegeven heeft. De meesten zijn nog steeds redelijk eenvoudig in een regexp te vangen. Maar dan moet je meer weten van de mogelijke data.
Misschien worden voorvoegsels bijvoorbeeld met komma achter de achternaam geplaatst.
En sommige zijn zelfs niet handmatig te bepalen (verschil tussen een initiaal met een V of een afgekorte van), laat staan automatisch.

Het gaat echter om de vervangende techniek die korter is. Als het kwaliteit betreft is de huidige code net zo min betrouwbaar.
 
Volgens mij geeft deze 100% correcte resultaten. Probeer maar eens.

PHP:
echo preg_replace("/([A-z]+[^A-z]*)/e", "ucfirst('\\1')",  $username);
 
Volgens mij geeft deze 100% correcte resultaten. Probeer maar eens.

PHP:
echo preg_replace("/([A-z]+[^A-z]*)/e", "ucfirst('\\1')",  $username);


Dat lijkt mij inderdaad een goede regexp hiervoor :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan