2011-03-25 2 views
2

나는 간단 할 것이라고 생각하지만 꽤 복잡하다는 문제가 있습니다.PHP 및 멀티 바이트 문자 사용에 대한 도움말

로마자, 서유럽 어, 일본어 및 한국어 문자와 구두점이 혼합 된 긴 UTF-8 문자열이 있습니다. 많은 것은 멀티 바이트 문자이지만 일부는 생각하지 않습니다.

나는이 일을해야합니다

  1. 확인 (새 문자열, 속는 박탈 및 출력) 중복 문자가 없는지 확인합니다.
  2. 새 문자열을 무작위로 섞습니다. (죄송합니다, 내가 바로 포맷을 인용 코드를 얻이 수없는 것 ...)

function uniquechars($string) { 
    $l = mb_strlen($string); 
    $unique = array(); 
    for($i = 0; $i < $l; $i++) { 
     $char = mb_substr($string, $i, 1); 
     if(!array_key_exists($char, $unique)) 
      $unique[$char] = 0; 
     $unique[$char]++; 
    } 
    $uniquekeys = join('', array_keys($unique)); 
    return $uniquekeys; 
} 

과 :

function unicode_shuffle($string) 
{ 
    $len = mb_strlen($string); 
    $sploded = array(); 
    while($len-- > 0) { 
     $sploded[] = mb_substr($string, $len, 1); 
    } 
    shuffle($sploded); 
    $shuffled = join('', $sploded); 
    return $shuffled; 
} 

그 두 가지 기능을 사용하여, 사람이 매우 유용하게 제공되었으므로, 나는 모든 것이 설정되었다고 생각합니다. 흥미롭게도, 유니크 문자열 (중복 없음)처럼 보이고 셔플 링 된 문자열에는 같은 수의 문자가 포함되지 않습니다. (나는이 브라우저를 브라우저에서 강조 표시 한 다음 다른 응용 프로그램으로 잘라 붙이기를 원합니다. 한 문자열은 항상 위의 문자열과는 길이가 다르지만 종종 달라집니다 ... 같은 문자 수는 아닙니다. 매회 잘린!).

죄송합니다. PHP에 대해 잘 모르거나 자기 자신을 괴롭히기 위해 코딩하는 것에 대해 미안하지만 여기에 무슨 일이 벌어지고 있습니까? 큰 긴 끈을 섞는 것이 쉬워야하는 것처럼 보이지만 분명히 생각보다 훨씬 어려워 보입니다. 이 작업을 수행하는 또 다른, 쉬운 방법이 있습니까? 문자열을 먼저 각 16 진수로 변환하고이를 섞어서 UTF-8로 다시 변환해야합니까? 화면이 아닌 파일로 출력해야합니까?

누구든지 제안 사항이 있으십니까? 미안 해요,이게 아주 새롭고, 어쩌면 나는 정말 바보 같은 짓을하고있을뿐입니다.

+0

코드를 쉽게 포맷 할 수 있습니다. 모든 줄 앞에 4 칸을 사용하면 코드로 인식됩니다. 코드를 다시 포맷하십시오. –

+0

나는 이미 그랬다. ... – apesa

+0

@apesa : 고마워! 나는 어떻게 든 첫 줄에만 4 칸을 넣어야한다고 생각했습니다. – Dave

답변

2

아마도 훨씬 더 간단 할 수 있습니다. 당신이 순서를 개편하려는 경우 단지 shuffle 고유 문자의 배열을 전달,

// returns an array of unique characters from a given string 
function getUnique($string) { 

    $chars = preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY); 
    $unique = array_unique($chars); 

    return $unique; 

} 

다음 :

$shuffled = shuffle($unique); 
다음

문자열 만 고유 문자를 얻을 수있는 기능입니다

편집 : 멀티 바이트 문자의 경우이 함수는 트릭을 수행해야합니다 (http://php.net/manual/en/function.mb-split.php 덕분에 정규 표현식에 도움) :

function getUnique($string) { 

    $chars = preg_split('/(?<!^)(?!$)/u', $string); 
    $unique = array_unique($chars); 

    return $unique; 

} 
+0

Craig, 이것을 제공해 주셔서 대단히 감사합니다 ... 조금 다른 방식으로 시도하기로 결정했습니다 : 유니 코드 사용. 이 옵션을 편집하여 & # ABCD에있는 고유 한 패턴을 제거 할 수 있습니까? 체재? 어느 쪽이든 제안 해 주셔서 감사합니다 !! 나는 이것을 시도 할 것이고, 손가락을 교차 시키게 할 것이다! – Dave

+0

@Dave - 문제가되지 않습니다. 도움이되기를 바랍니다.한자가 들어있는 문자열로 테스트 해봤는데 완벽하게 작동하는 것처럼 보였습니다. (브라우저에서 볼 때 UTF-8 헤더 세트가 출력되도록 설정했는지 확인하십시오. 그렇지 않으면 잘못된 것으로 보입니다). '& # uABCD; 형식화 된 문자로 작업하는 것을 권장하지는 않을 것입니다. 왜냐하면 여러분 자신이 좀 더 복잡해지기 때문입니다. 그러나 정규 표현식을 사용할 수있을 것이라고 확신합니다. 일이 잘 풀리면 알려주세요. –

관련 문제