Frage

Arrrgh.Weiß jemand, wie man eine Funktion erstellt, die dem Multibyte-Zeichen entspricht, das dem PHP-Befehl count_chars ($ string, 3) entspricht?

So dass eine Liste von NUR EINEM INSTANZ jedes einzelnen Zeichens zurückgegeben wird.Wenn das Englisch wäre und wir hätten

"aaabggxxyxzxxgggghq xcccxxxzxxyx"

Es würde "abgh qxyz" zurückgeben (Beachten Sie, dass das Leerzeichen gezählt wird).

(Die Reihenfolge ist in diesem Fall nicht wichtig, kann alles sein).

Wenn japanisches Kanji (nicht sicher, ob alle Browser dies unterstützen):

私 漢 p 漢字 私 私 字 私 字 漢字 私 漢字 私 私

Und es werden nur die 3 verwendeten Kanji zurückgegeben:

漢字 私

Es muss mit jeder UTF-8-codierten Zeichenfolge funktionieren.

War es hilfreich?

Lösung

Hey Dave, du wirst diesen nie kommen sehen.

php > $kanji = '漢漢漢字漢字私私字私字漢字私漢字漢字私';
php > $not_kanji = 'aaabcccbbc';
php > $pattern = '/(.)\1+/u';
php > echo preg_replace($pattern, '$1', $kanji);
漢字漢字私字私字漢字私漢字漢字私
php > echo preg_replace($pattern, '$1', $not_kanji);
abcbc

Was, Sie dachten, ich würde wieder mb_substr verwenden?

In Regex-Sprache wird nach einem beliebigen Zeichen gesucht, dann nach einer oder mehreren Instanzen desselben Zeichens. Der übereinstimmende Bereich wird dann durch das übereinstimmende Zeichen ersetzt.

Der u-Modifikator aktiviert UTF-8 Modus in PCRE, in dem UTF-8-Sequenzen anstelle von 8-Bit-Zeichen behandelt werden. Solange die verarbeitete Zeichenfolge bereits UTF-8 ist und PCRE mit Unicode-Unterstützung kompiliert wurde, sollte dies für Sie in Ordnung sein.


Hey, weißt du was?

$not_kanji = 'aaabbbbcdddbbbbccgggcdddeeedddaaaffff';
$l = mb_strlen($not_kanji);
$unique = array();
for($i = 0; $i < $l; $i++) {
    $char = mb_substr($not_kanji, $i, 1);
    if(!array_key_exists($char, $unique))
        $unique[$char] = 0;
    $unique[$char]++;
}
echo join('', array_keys($unique));

Dies verwendet den gleichen allgemeinen Trick wie der Shuffle-Code. Wir nehmen die Länge der Zeichenfolge und extrahieren sie dann mit mb_substr zeichenweise. Wir verwenden dieses Zeichen dann als Schlüssel in einem Array. Wir nutzen die Positionsarrays von PHP: Schlüssel werden in der Reihenfolge sortiert, in der sie definiert sind. Sobald wir die Zeichenfolge durchgesehen und alle Zeichen identifiziert haben, greifen wir nach den Schlüsseln und verbinden sie wieder in der Reihenfolge, in der sie in der Zeichenfolge erscheinen. Mit dieser Technik erhalten Sie auch eine Zeichenanzahl pro Zeichen.

Dies wäre viel einfacher gewesen, wenn es einen mb_str_split gegeben hätte, der zu str_split .

(Kein Kanji-Beispiel hier, ich habe einen Fehler beim Kopieren / Einfügen.)


Probieren Sie dies hier für die Größe an:

function mb_count_chars_kinda($input) {
    $l = mb_strlen($input);
    $unique = array();
    for($i = 0; $i < $l; $i++) {
        $char = mb_substr($input, $i, 1);
        if(!array_key_exists($char, $unique))
            $unique[$char] = 0;
        $unique[$char]++;
    }
    return $unique;
}

function mb_string_chars_diff($one, $two) {
    $left = array_keys(mb_count_chars_kinda($one));
    $right = array_keys(mb_count_chars_kinda($two));
    return array_diff($left, $right);
}

print_r(mb_string_chars_diff('aabbccddeeffgg', 'abcde'));
/* => 
Array
(
    [5] => f
    [6] => g
)
*/

Sie möchten dieses zweimal aufrufen, das zweite Mal mit der linken Zeichenfolge rechts und der rechten Zeichenfolge links. Die Ausgabe wird anders sein - array_diff gibt Ihnen nur das Zeug auf der linken Seite, das auf der rechten Seite fehlt, also müssen Sie es zweimal tun, um die ganze Geschichte zu erhalten.

Andere Tipps

Bitte versuchen Sie, die iconv_strlen PHP-Standardbibliotheksfunktion zu überprüfen.Ich kann nichts über Orient-Codierungen sagen, aber es funktioniert gut für europäische und osteuropäische Sprachen.Auf jeden Fall gibt es etwas Freiheit!

$name = "My string";
$name_array = str_split($name);
$name_array_uniqued = array_unique($name_array);
print_r($name_array_uniqued);

Viel einfacher.Benutzer str_split, um die Phrase in ein Array mit jedem Zeichen als Element umzuwandeln.Verwenden Sie dann array_unique, um Duplikate zu entfernen.Ziemlich einfach.Nichts kompliziertes.Ich mag es so.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top