Я ищу способ прописать первые буквы / строки строки, в том числе, где имена соединены дефисом, например, adam smith-jones должен быть Adam Smith-Jones.
ucwords()
(или ucfirst()
если я разделяю их на имя, фамилию), только Адам Смит-Джонс
$string = implode('-', array_map('ucfirst', explode('-', $string)));
Это нормально ?
function to_upper($name) { $name=ucwords($name); $arr=explode('-', $name); $name=array(); foreach($arr as $v) { $name[]=ucfirst($v); } $name=implode('-', $name); return $name; } echo to_upper("adam smith-jones");
Что вы думаете о следующем коде?
mb_convert_case(mb_strtolower($value), MB_CASE_TITLE, "UTF-8");
Обратите внимание, что это также обрабатывает символы с акцентом (полезно для некоторых языков, таких как французский).
Другой путь:
<?php $str = 'adam smith-jones'; echo preg_replace("/(-)([az])/e","'\\1'.strtoupper('\\2')", ucwords($str)); ?>
/** * Uppercase words including after a hyphen * * @param string $text lower-case text * @return string Upper-Case text */ function uc_hyphenated_words($text) { return str_replace("- ","-",ucwords(str_replace("-","- ",$text))); }
<?php // note - this does NOT do what you want - but I think does what you said // perhaps you can modify it to do what you want - or we can help if you can // provide a bit more about the data you need to update $string_of_text = "We would like to welcome Adam Smith-jones to our 3rd, 'I am addicted to stackoverflow-posting' event."; // both Smith-Jones and Stackoverflow-Posting should result // may be wrong $words = explode(' ',$string_of_text); foreach($words as $index=>$word) { if(false !== strpos('-',$word)) { $parts = explode('-',$word); $newWords = array; foreach($parts as $wordIndex=>$part) { $newWords[] = ucwords($part); } $words[$index] = implode('-',$newWords); } } $words = implode(' ',$words); ?>
Что-то похожее на это – непроверено – для того, чтобы убедиться, что я понимаю вопрос.