如何使用PHP识别/分离联合词?

时间:2017-11-03 09:02:38

标签: php dictionary dns

之前我曾尝试过问过这个问题,但显然提供的细节太少而且已经关闭了。让我再试一次:

我需要做的是将任何联合词分开,特别是在域名中。如果有域名" 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') );

非常感谢任何和所有想法。

2 个答案:

答案 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']));

您可以为searchreplace提供数组以进行字符串替换。对于后者,我们可以使用array_mapucfirst对它们进行大写转换。

我也把单词列为一个参数,看起来就像是要做的事情,因为它会让它变得更便携。

输出

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