之前我曾尝试过问过这个问题,但显然提供的细节太少而且已经关闭了。让我再试一次:
我需要做的是将任何联合词分开,特别是在域名中。如果有域名" domainname.com",我需要拥有"域名"和"名称"回。如果是" stackoverflow.com",我需要" stack"和"溢出"返回。
我想我需要一个单词列表才能做到这一点,这不是问题。请记住,有多种方式可以将一些联合词分开(" stackoverflow.com"可以返回"堆栈"和"溢出"或者&## 34; stack"," over"" flow"),我已经提出了这个php功能,但它需要改进。
function make_words_capitalised( $str )
{
// Full list of words
$words = array( 'you', 'tube', 'my', 'space' );
// Capitalize separate words
foreach( $words as $word )
{
$str = str_ireplace( $word, ucfirst($word), $str );
}
return $str;
}
var_dump( make_words_capitalised('youtube.com') );
var_dump( make_words_capitalised('myspace.com') );
非常感谢任何和所有想法。
答案 0 :(得分:0)
这是我能做的最好的事情(而且我觉得它还不错)
function make_words_capitalised( $str, array $words)
{
return str_ireplace($words, array_map('ucfirst', $words), $str);
}
var_dump( make_words_capitalised('youtube.com', ['you', 'tube']));
var_dump( make_words_capitalised('myspace.com', ['my', 'space']));
您可以为search
和replace
提供数组以进行字符串替换。对于后者,我们可以使用array_map
和ucfirst
对它们进行大写转换。
我也把单词列为一个参数,看起来就像是要做的事情,因为它会让它变得更便携。
输出
string(11) "YouTube.com"
string(11) "MySpace.com"
你可以在这里测试一下。
http://sandbox.onlinephpfunctions.com/code/d0b2367a5438701735f0c909c62f8289edaa08b4
这与你最初的想法基本相同,只是清理了一下,然后打磨了一下。
答案 1 :(得分:0)
在我看来,你的方法还可以。我建议使用strtr()字符串PHP函数,您可以在官方文档here中阅读更多内容。
除此之外,我会尝试为这个函数提供更多的灵活性,并且我会使用静态方法将它与所有需要的变量一起封装在一起。
它看起来像这样:
class Capitalize
{
/**
* @var array
*/
private static $dictionary = ['you', 'tube', 'my', 'space'];
/**
* @var array
*/
private static $transDictionary = [];
/**
* Capitalize all the words in the given text, based on the dictionary
* @param $sentence
* @return string
*/
public static function capitalizeWords($sentence)
{
if (count(self::$transDictionary) == 0) {
self::generateTransDictionary();
}
return strtr($sentence, self::$transDictionary);
}
/**
* Generates a private translation dictionary based on the dictionary property
*/
private static function generateTransDictionary()
{
$capWords = array_map('ucfirst', self::$dictionary);
static::$transDictionary = array_combine(self::$dictionary, $capWords);
}
/**
* Static getter - might be needed in the future
* @return array
*/
public static function getDictionary()
{
return self::$dictionary;
}
/**
* @param $word
*/
public static function addToDictionary($word)
{
static::$dictionary[] = $word;
if (count (self::$transDictionary) != 0) self::generateTransDictionary();
}
}
echo Capitalize::capitalizeWords('youtube.com');
echo Capitalize::capitalizeWords('spacetube.com');
Capitalize::addToDictionary('science');
echo Capitalize::capitalizeWords('sciencetube.com');