I know, I know, I have a lot of work to do...I shouldn't be doing 
this. I did get to play with PCRE regexps here, though...lotsa cool 
features over eregs!. Anyway, here's a *** NEW!!! IMPROVED!!! *** 
version of smart_ucwords(), that's probably way too much overkill. I 
did some quick tests, seems to work. Beware of email-induced 
line-wrapping, particularly in the comment black & quoted strings:

<?php

function smart_ucwords($String, $ForceCase=1, $CapitalizeTrailing=1) {

################################################################################
#
#  A more sophisticated approach to title-casing.
#
## PARAMETERS 
##################################################################
#
#  $String              string   Input string.
#  $ForceCase           0|1      If true, will force title case (only 
first letter
#                                capitalized, no matter what case the 
string is in.
#  $CaptializeTrailing  0|1      If true, will capitalize a normally-excepted
#                                word if it is the last word in the 
string. So, a
#                                string like 'Shot In the Dark, A' 
works properly.
#
## USAGE NOTES 
#################################################################
#
#  The Exception List words should be in the case you desire; 
normally this will
#  be lowercase.
#
#  The Invariant List contains words and titles (eg; NASA, MySQL, PostGreSQL,
#  eBusiness) whose capitalization should be fixed, no matter what.
#
#  If one of these arrays is not to be used, simply set it to array().
#
## MODIFICATION HISTORY 
########################################################
#
#  14 august 2001: S. Edberg, UCDavis <[EMAIL PROTECTED]>
#  Original
#
################################################################################

    $EXCEPTION_LIST = array(
       'a', 'an', 'and', 'at', 'but', 'for', 'nor', 'or', 'some', 
'the', 'to', 'with'
    );
   
    $INVARIANT_LIST = array(
       'NASA', 'MySQL', 'PostGreSQL', 'eBusiness'
    );
   
#  First, strip & save leading & trailing whitespace

    preg_match(
       '/^(\s*?)(.*)(\s*)$/U',
       ($ForceCase ? strtolower($String) : $String),
       $StringParts
    );

#  Replace exception words

    $String = ucwords($StringParts[2].($CapitalizeTrailing ? '' : ' '));

    foreach ($EXCEPTION_LIST as $Word) {
       $String = preg_replace("/(\s+)$Word(\s+)/i", "\\1$Word\\2", $String);
    }

#  Replace invariants

    $String = " $String ";
   
    foreach ($INVARIANT_LIST as $Word) {
       $String = preg_replace("/(\s+)$Word(\s+)/i", "\\1$Word\\2", $String);
    }

#  Replace whitespace and return

    return $StringParts[1].trim($String).$StringParts[3];

}

?>


At 4:09 PM -0500 8/13/01, Jeff Oien wrote:
>Fabulous. Thanks to Steve and Mark. Exactly what I needed.
>Jeff Oien
>
>>  >Something like this, perhaps (untested):
>>
>>  I needed this too so I just tested it.
>>
>>  >function smart_ucwords($String)
>>  >{
>>  >
>>  >   $ExceptionList = array('the', 'an', 'a'); # should all be in
>>  >lowercase
>>  >
>>  >   $String = ucwords(strtolower(ltrim($String))); # LINE A
>>  >
>>  >   foreach ($ExceptionList as $Word)
>>  >   {
>>  >   $String = eregi_replace("[[:space:]]+$Word[[:space:]]+",
>>  >$Word, $String);
>>  >   }
>>
>>
>>  this line should be more like:
>>  $String = eregi_replace("([[:space:]]+)".$Word."([[:space:]]+)",
>>  "\\1".$Word."\\2", $String);
>>
>>  >   return $String; # LINE B
>>  >
>>  >}
>>
>>  thanks!
>>  - Mark
>  >
>

-- 
+------ Factoid: Of the 100 largest economies in the world, 51 are ------+
| Steve Edberg                           University of California, Davis |
| [EMAIL PROTECTED]                               Computer Consultant |
| http://aesric.ucdavis.edu/                  http://pgfsun.ucdavis.edu/ |
+--- corporations ------ http://www.ips-dc.org/reports/top200text.htm ---+

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to