Wyrazy z dużej litery

0

witam potrzebuję przetworzyć string tak żeby wszystkie wyrazy zaczynały się od duzej litery, bazuję na standardowym:

    $string = ucwords(strtolower($string));

ale jak zrobić aby wyrazy typu np: cyfry rzymskie, nazwy własne, skróty, itp napisane duzymi literami nie były przetwarzane czyli np: WOŚP ma zostać jako WOŚP a nie Wośp,
oraz druga sprawa: wyrazy zaczynające sie od polskich znaków typu ŁÓŚĄĘĆ .... również były przetwarzane poprawnie, bo zastosowanie powyższego przykładu niestety nie działa.

2

Potrzebujesz:

  1. biblioteki multibyte (domyślnie w php jest dostępna, na localhoście być może będziesz musiał ją odblokować w php.ini), która rozróżnia polskie znaki
  2. kawałka kodu

Masz gotowca z komentarzami:

$text = "łodzkie województwo WsPieRa WOŚP na XXII finale KTÓry odbyŁ się 23 lutego";
echo ucwords2($text);


function ucwords2($text, $encoding='utf-8') {
    $words = mb_split(' ', $text); // rozbija tekst po spacji
    foreach ($words as $key=>$word) { // po kolei po tablicy ze słowami
        if (!mb_isallupper($word, $encoding)) { // jeżeli NIE jest tak, że wszystkie litery są duże
            // to znaczy, że to nie jest cyfra rzymska/skrót
            // i uruchamiamy funkcję, która przekszałci string i podstawiamy wynik do tablicy słów
            $words[$key] = mb_ucfirst(mb_strtolower($word, $encoding), $encoding);
        }
    }
    return implode(' ', $words); // zwracając - łączymy tablicę słów spacją
}

function mb_isallupper($string, $encoding) { // sprawdza czy wszystkie litery są duże
    // jeżeli tekst jest taki sam jak jego przekształcenie na duże litery to znaczy, że wszystkie są duże
    return $string ===  mb_strtoupper($string, $encoding);
}

// w bibliotece multibyte nie ma ucfirst, więc trzeba sobie zrobić
// z lenistwa skopiowałem funkcję stąd:
// http://stackoverflow.com/questions/2517947/ucfirst-function-for-multibyte-character-encodings
function mb_ucfirst($string, $encoding) {
    $strlen = mb_strlen($string, $encoding);
    $firstChar = mb_substr($string, 0, 1, $encoding);
    $then = mb_substr($string, 1, $strlen - 1, $encoding);
    return mb_strtoupper($firstChar, $encoding) . $then;
}
0

wiesz co dzek69 twój gotowiec jest całkiem fajny, tylko jak zawsze jest małe ale ... otóż jezeli polskie znaki typu ŁÓŚĄĘŹ ... dasz w cudzysłów np. jak w Twoim przykładzie: "łodzkie" województwo WsPieRa WOŚP na XXII finale KTÓry odbyŁ się 23 lutego - to łodzkie zostanie z małej litery ;(.

0

to teraz ćwiczenie pt. "zrób to sam" skoro przedtem dostałeś gotowca ;)

podpowiedzi:

  1. jak rozpoznać czy znak jest literą (a nie znakiem specjalnym) - otóż jeżeli mb_strtoupper($znak) === mb_strtolower($znak) - to znaczy, że znak jest znakiem specjalnym [to pewnie może nie mieć zastosowania do pisma arabskiego/chińskiego, ale tutaj cały Twój kod może nie mieć zastosowania]
  2. napisz sobie funkcję, która szuka pierwszego znaku-litery i na bazie mb_ucfirst zrób funkcję, która zamienia konkretną literę ze stringa na dużą.
  3. nie stosuj $zmienna{$i} i podobnych, bo się posypie na kodowaniu wieloznakowym, zawsze mb_substr
0

a gdybym zastosował mb_convert_case ?

0

to sobie sprawdź - nie działa :P
ale fakt, można było tego użyć zamiast własnej funkcji mb_ucfirst, nie doczytałem manuala tylko zasugerowałem się stackoverflowem ;)

tak czy siak - zadanie domowe na Ciebie czeka

0

tak jak wcześniej napisałem, zrobiłem to inaczej - przy pomocy mb_convert_case + wyrazenia regularne (o połowę krócej i szybciej) :-)

0

pokaż kod ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1