<?php
$string1 = "FARMER John";
$string2 = "OVERMARS DE Rafa";
$string3 = "VAN DER BELT Dick";
?>
Чтобы сохранить имя и фамилию в базе данных MySQL, мне нужно разделить строку.
Выше вы можете увидеть несколько примеров.
Как лучше всего разбить эту строку, обратите внимание, что фамилия в заглавных буквах.
Результат должен быть:
ResultString1: Джон ФЕРМЕР
ResultString2: Рафа ОВЕРМАРС ДЕ
ResultString3: Дик ван дер ремень
Это действительно плохая идея.
Есть тонны вещей, которые могут пойти не так, если вы просто полагаетесь на регистр букв для обозначения чего-либо. И сохранение всего этого в другой строке только увековечивает проблему.
Тем не менее, вы можете уменьшить (небольшое количество) вредность, сохраняя новые значения отдельно, чтобы не передавать неструктурированную информацию следующему несчастному человеку, который должен поддерживать вашу базу данных. Этот код делает это, в то же время допуская имена из нескольких слов (например, «Джон Пол» или тому подобное).
Я также сделал это обрабатывать их в виде массива, так как я предполагаю, что вы, вероятно, хотите обрабатывать более трех имен.
<?php
$string1 = "FARMER John";
$string2 = "OVERMARS DE Rafa Dafa";
$string3 = "VAN DER BELT Dick";
$strings = array(array('orig'=>$string1), array('orig'=>$string2), array('orig'=>$string3));
foreach($strings as $key=>$val){
$oldwords = explode(' ',$val['orig']);
foreach($oldwords as $word){
if(preg_match('/[a-z]/',$word)){
$firstname .= " ".$word;
}else{
$lastname .= " ".$word;
}
}
$firstname = trim($firstname);
$lastname = trim($lastname);
$strings[$key]['newfirst'] = $firstname;
$strings[$key]['newlast'] = $lastname;
$firstname = "";
$lastname = "";
}
print_r($strings);
?>
Выполните следующие шаги:
Преобразовать массив обратно в строку.
$string3 = "VAN DER BELT Dick";
$arr = explode(" ", $string3);
array_unshift($arr, array_pop($arr));
echo implode(" ", $arr); // Dick VAN DER BELT
$arr = explode(" ", $string3);
$last_word = array_pop($arr);
$final_string = ucfirst($last_word)." ".strtoupper(implode(" ", $arr));
echo $final_string;
Как говорили другие, описание вашей проблемы довольно расплывчато. Однако с таким фиксированным шаблоном вы можете очень легко разделить имена с помощью регулярного выражения (учитывая, что фамилия всегда в верхнем регистре):
<?php
$strings = array("FARMER John", "OVERMARS DE Rafa", "VAN DER BELT Dick");
$regex = '~^([A-Z ]+\b)(\w+)$~';
foreach ($strings as $string) {
if(preg_match($regex, $string, $match)) {
$surname = trim($match[1]);
$forename = trim($match[2]);
echo "Surname: $surname, Forename: $forename\n";
}
}
?>
Увидеть рабочий демо на ideone.com (плюс один на regex101.com).