2017-11-03 6 views
0

이 질문을하기 전에 시도했지만 분명히 너무 자세하게 제공하지 못했고 닫혔습니다. 조금 더 철저히하여 다시 시도하겠습니다.PHP를 사용하여 공동 단어를 인식/분리하는 방법은 무엇입니까?

내가해야 할 일은 공동 단어, 특히 도메인 이름을 구분하는 것입니다. 도메인 "domainname.com"이 있으면 "domain"과 "name"을 반환해야합니다. 그것이 "stackoverflow.com"이라면, "stack"이 필요하고 "overflow"가 반환됩니다.

나는 이것을하기 위해 단어 목록이 필요하다고 생각하는데 그것은 문제가되지 않습니다. 여러 공동 단어가 분리 될 수 있다는 것을 명심하십시오 ("stackoverflow.com"은 "스택"및 "오버플로"또는 "스택", "오버"및 "플로우"로 반환 될 수 있음), 나는 왔습니다 이 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

첫 번째 문제. 위의 방법을 사용하면 엉망이됩니다. 내가 제안하는 것은 문자열을 가리키는 키로 도메인 이름을 포함하는 배열을 갖는 것입니다. 즉 array ('youtube.com'=> ​​배열 ('YOU TUBE'))'입니다. 이 방법을 사용하면 훨씬 더 많은 설정이 필요하지만 단어를 바꾸는 것이 훨씬 더 좋을 것입니다. – mic

+0

은 엄격하게 단어입니까? – ArtisticPhoenix

답변

0

내가 할 수있는 최선이다 (그리고 나는 그것이 꽤 좋은 생각)을 searchreplace을 위해, 당신은 대체 문자열 배열을 줄 수

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

. 후자의 경우 array_mapucfirst을 사용하여 대문자 변환을 수행 할 수 있습니다.

단어 목록을 인자로 만들었습니다. 할 일처럼 보였습니다. 더 휴대하기 쉽기 때문입니다.

출력은

string(11) "YouTube.com" 
string(11) "MySpace.com" 

당신은 여기를 테스트 할 수 있습니다.

http://sandbox.onlinephpfunctions.com/code/d0b2367a5438701735f0c909c62f8289edaa08b4

이것은 단지 정리하고, 약간 광택, 기본적으로 원래 있던 같은 생각입니다.

0

제 의견에는 접근 방법이 괜찮습니다. strtr() string PHP 함수를 사용하여 공식 문서 here에서 더 많은 내용을 읽을 수 있습니다.

게다가이 함수에 약간의 유연성을 부여하려고합니다. 고정 메서드가있는 클래스 내부의 필요한 모든 변수와 함께이 함수를 캡슐화합니다.

그것은 다음과 같이 보일 것이다 : 나는 당신의 행함은`즉, 당신이 목록의 단어를 포함하는 도메인 이름이 때 발생하는 yoursitespace.com` 무엇으로 볼 수

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

좋은 일, 그냥'array_map ('ufirst', self :: $ dictionary)'할 수 있습니다. 닫을 필요가 없습니다. – ArtisticPhoenix

+0

좋은 지적! 감사! 그에 따라 솔루션을 업데이트했습니다. – Alex