Avatar of joomla
joomla
Flag for Australia asked on

Array Handling in PHP

I use this script to ensure surnames are 'propercase' in php/mysql
This script sets the first character as uppercase and the first character after an apostraphe to uppercase as well.
I'd like to add some additional checks.
For example I'd like to check for hyphenated names and double barrelled names
ie
jones-smith becomes Jones-Smith
and
SMITH JONES becomes Smith Jones
I suspect we need an array to manage the apostraphe, hyphen & space.
thanks
Michael


if (strstr($surname, '\'')) {
  // Divide the surname into multiple parts, divided by apostrophes
  $surnameDivided = explode('\'', $surname);
  // Capitalize the first letter of each "part" of the surname
  foreach ($surnameDivided as &$part) {
    $part = ucfirst(strtolower($part));
  }
  // Bring the surname together again, with apostrophes
  $surname = implode('\'', $surnameDivided);
}

// If there is not an apostrophe in the surname,
// capitalize the first letter as you normally would
else {
  $surname = ucfirst(strtolower($surname));
}
PHP

Avatar of undefined
Last Comment
Ray Paseur

8/22/2022 - Mon
shanikawm

Try something like this. Not sure I got your idea correctly.

This prints,

Jones Smith | Johnes Smith | Jone'S Smith | Jones-Smith
<?php
$name="jones smith | JOHNES SMITH | jone's smith | jones-smith ";
echo preg_replace("/(\b|-|')([^\b])([^\b]*?)/e","'\\1'.strtoupper('\\2').'\\3'",strtolower($name)).PHP_EOL;
?>

Open in new window

joomla

ASKER
Hi shanikawm:
what I'm trying to achieve is to update a set of records which may contain 10,000 records
examples of names might be

o'brien             ---------   O'Brien
barrett-o'reily   ---------   Barrett-O'Reily
smith jones     ----------   Smith Jones
burns               ---------   Burns
CROWTHER   ----------   Crowther

thanks


shanikawm

Hi Joomla,

All your cases are working with my script. Try

$name="o'brien | barrett-o'reily | smith jones | burns | CROWTHER"
or one by one like $name=" barrett-o'reily", $name="barrett-o'reily"
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
joomla

ASKER
Hi,
I may be misunderstanding your script
If I don't know what $name is, will the test work for names like o'connell and brook-jones

regards
M
shanikawm

Hope following code wil be clear for you. I just wrote your code with one line in a different way. It works for apostraphe, hyphen & space.
<?php
$surname="o'connell";
$surname=preg_replace("/(\b|-|')([^\b])([^\b]*?)/e","'\\1'.strtoupper('\\2').'\\3'",strtolower($surname));
echo $surname.PHP_EOL;
?>

// or

<?php
$surname="brook-jones";
$surname=preg_replace("/(\b|-|')([^\b])([^\b]*?)/e","'\\1'.strtoupper('\\2').'\\3'",strtolower($surname));
echo $surname.PHP_EOL;
?>

Open in new window

Ray Paseur

Here is the REGEX, annotated.  As you can see from the last example, there is more to getting this right than just capitalizing words.  And there are names from many languages ported into English (like van de Graaf) that do not follow the rules you have set out for capitalization.
<?php // RAY_temp_names.php
error_reporting(E_ALL);
echo "<pre>";

$regex
= "/"             // START REGEX DELIMITER
. "(\b|-|')"      // GROUP 1 - LETTER FOUND AT WORD BOUNDARY, OR DASH, OR APOSTROPHE
. "([^\b])"       // GROUP 2 - LETTER STARTS ON WORD BOUNDARY
. "([^\b]*?)"     // GROUP 3 - LETTER STARTS ON WORD BOUNDARY, ZERO OR MORE CHARS, UNGREEDY
. "/"             // END REGEX DELIMITER
. "e"             // EVALUATE FOR REPLACEMENT
;

$repl
= "'\\1'"
. "."
. "strtoupper('\\2')" // THE UPPERCASE
. "."
. "'\\3'"
;

// TEST NAMES
$names = array
( "o'brien"
, "barrett-o'reily"
, "Barrett-O'Reily"
, "smith jones"
, "burns"
, "CROWTHER"
, "George W. Bush, III"
)
;

// SHOW THE WORK PRODUCTS
foreach ($names as $name)
{
    // $new = preg_replace("/(\b|-|')([^\b])([^\b]*?)/e","'\\1'.strtoupper('\\2').'\\3'",strtolower($name));

    $new = preg_replace($regex, $repl, strtolower($name));
    echo PHP_EOL . "$name $new";
}

Open in new window

⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
ASKER CERTIFIED SOLUTION
Ray Paseur

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
joomla

ASKER
My goodness Ray
excellent script
you don't do anything by half do you?

thanks
M
Ray Paseur

Thanks for the points.  It's actually a fairly common question, so I have dealt with it a few times before.  Common rules of grammar get distorted a little bit when we have to deal with proper names.  Best regards, ~Ray