So if I have a last name like Macon, will it make it MacOn, or leave it
alone? How do you tell?

---John Holmes...
----- Original Message -----
From: "-<[ Rene Brehmer ]>-" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, October 30, 2002 2:53 PM
Subject: [PHP] Capitalizing names etc. part II - found a solution


> Hi y'all
>
> A while back I requested help for properly capitalizing names out of
> passed string values, as ucwords() and tokenizing didn't do the trick.
>
> Some kind soul gave me this scripple to work with:
>
> > $text = "What?No delimiters,shit happens here.this solves all
problems.";
> > preg_match_all("/(\w+[,. ?])+/U", $text, $words);
> > foreach($words[0] as $part) $uwords[] = ucfirst($part);
> > $text = implode("", $uwords);
> > echo $text;
>
> Which didn't work at all (even changing the variables to match my own),
> but only got me several errors for each line...
>
> My task was to make it take a string like
> "firstname_middlename_firstlastname-lastlastname" and properly capitalize
> it. Also wanted it to do it correctly with names like O'Connor, MacEnroe,
> McCarthy and such... The scribble above would be able to do it with the
> O'Connors and name-name formats, but useless with Mac/Mc names ... plus
> the above script part didn't work at all on my system (PHP 4.2.3 on Apache
> 2.0.40 on WinXP Pro).
>
> OK ... so I wanted a compact structure that could do this easily, and
> correctly, on ANY name I threw at it...so I've spent a couple of hours
> finding useful functions in PHP that would do the trickery easiest ... and
> ended up with this:
>
> $name = $HTTP_GET_VARS['name'];
>
> // pull real name out of $name
> $realname = "";
> // okay, let's get the names cap'ed correctly...
> $startat = 0; // these vars are used for substring pulling
> $stoplen = 0;
> // parse 1, find funny chars and cap after them
> for ($i = 0; $i < strlen($name); $i++) {
>    $ltr = substr($name, $i, 1); // pull out letter i of name
>    $stoplen = $i - $startat;  // set the stop point for substring
>    // if current letter is a marker
>    if ($ltr == "_" | $ltr == "-" | $ltr == "'") {
>       // add substring
>       $realname .= ucfirst(substr($name, $startat, $stoplen));
>       $startat = $i + 1;  // set new start point for substring
>    }
>    if ($ltr == "_") {  // if space, add space
>       $realname .= " ";
>    }
>    elseif ($ltr == "-") { // if dash, add dash
>       $realname .= "-";
>    }
>    elseif ($ltr == "'") {
>       $realname .= "'";
>    }
> }
> // the last name won't be added in parse 1,
> // this piece adds the last name AFTER checking and capping for Mac/Mc
> // so this is essentially pass 2
> $lastname = substr($name, $startat, $stoplen + 1);
> // find Mac/Mc
> $maclen = 0; // we set this to zero to make it easier to check for found
> if (strstr($lastname, "mc") != false) {  // if Mc is found...
>    $maclen = 2;
> }
> elseif (strstr($lastname, "mac") != false) {  // if Mac is found
>    $maclen = 3;
> }
> if ($maclen > 0) {  // add the MacSomething with proper capitalization
>    $realname .= ucfirst(substr($lastname, 0, $maclen));
>    $realname .= ucfirst(substr($lastname, $maclen, strlen($lastname)));
> }
> else { // if we can't find Mac/Mc, just add the last name...
>    $realname .= ucfirst($lastname);
> }
> // end namegame
>
> The curious thing is that this actually runs faster than the strtok() +
> ucwords() combo I had before, plus it does the trick correctly, everytime.
> If anyone can see a more efficient way of doing this, I'm all for it.
>
> Do note that I've intentionally made it so that the last word of all names
> won't be added to the $realname, until it's determined whether or not it
> starts with Mac/Mc. The point to this is simple: It's a lot more
> complicated to scan for the Mac/Mc after the full name is assembled, than
> it is while it's being built. My structure also ensure that if someone's
> called something like Mackenzie for first name, it will not be incorrectly
> cap'ed, as it only does the scotch-check on the last names...
>
> If you can do this simpler, or have any comments for this way of doing it,
> please let me know. You may freely copy and dsitribute this as you wish.
>
> Rene
> --
> Rene Brehmer
> System developer in the making...
>
> This message was written on 100% recycled spam.
>
> Come see! My brand new site is now online!
> http://www.metalbunny.net
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to