【问题标题】:How to recognize/separate joint words using PHP?如何使用 PHP 识别/分离联合词?
【发布时间】:2017-11-03 09:02:38
【问题描述】:

我之前尝试过问这个问题,但显然提供的细节太少,因此被关闭。让我更彻底地再试一次:

我需要做的是分离任何联合词,特别是在域名中。如果有域“domainname.com”,我需要返回“域”和“名称”。如果是“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') );

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

【问题讨论】:

  • 我看到的第一个问题是当您的域名包含列表词时会发生什么,即yoursitespace.com。使用上述方法会搞砸。我建议使用一个包含域名作为指向字符串的键的数组。即array('youtube.com' => array('YOU TUBE'))。这样做需要更多的配置,但比更改单词要好得多
  • 单词是严格意义上的字母吗?

标签: php dictionary dns


【解决方案1】:

这是我能做的最好的(而且我认为这很不错)

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

这本质上与您最初的想法相同,只是经过清理和完善。

【讨论】:

    【解决方案2】:

    在我看来,您的方法还可以。我只是建议使用 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');
    

    【讨论】:

    • 干得好,你可以这样做array_map('ufirst', self::$dictionary)不需要关闭。
    猜你喜欢
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多