словарь — Как распознать / отделить совместные слова с помощью PHP?

Я пытался задать этот вопрос раньше, но, очевидно, предоставил слишком мало деталей, и он был закрыт. Позвольте мне попробовать еще раз, будучи немного более тщательным:

Что мне нужно сделать, это отделить любое совместное слово, в частности, скажем, в доменных именах. Если существует домен «domainname.com», мне нужно вернуть «domain» и «name». Если это «stackoverflow.com», мне нужно вернуть «stack» и «overflow».

Я думаю, мне нужен список слов, чтобы сделать это, и это не проблема. Имея в виду, что существует несколько способов, которыми некоторые объединенные слова могут быть разделены («stackoverflow.com» может быть возвращен как «stack» и «overflow» или как «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

Решение

Вот лучшее, что я могу сделать (и я думаю, что это довольно хорошо)

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

По сути, это та же идея, что и у вас, только что вымытая и отполированная.

0

Другие решения

На мой взгляд, ваш подход в порядке. Я бы просто предложил использовать строковую функцию PHP strtr (), о которой вы можете прочитать в официальной документации. Вот.

Кроме того, я бы попытался придать этой функции немного больше гибкости и инкапсулировать ее вместе со всеми необходимыми переменными внутри класса со статическими методами.

Это будет выглядеть примерно так:

    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');
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector