Kjapp og trygg hosting for Wordpress

Problemer med å sette stor forbokstav med ucfirst, æ ø å

Hei
Er det noen som har en ide om hvordan man på best mulig måte kan sette stor forbokstav i en streng der første bokstav er en æ, ø eller å?

<?php
$foo = 'cola';
$foo = ucfirst($foo); // Cola :)
$bar = 'øl';
$bar = ucfirst($bar); // øl :-(
?>

Takker
 

adeneo

Medlem
ucfirst støtter vel bare de vanlige 256 ascii tegnene tror jeg.

Er ikke så veldig sprek på PHP, men kommer ikke på å ha lest om noe som gjør akkurat det du spør om, så jeg lagde en funksjon i et tappert forsøk på å løse det, aner ikke om det er riktig veien å gå?

PHP:
function min_ucfirst($str){
      $first = $str[0];
      if (preg_match('/[\'^æøå]/', $first)) {
	    $smaa  = array('æ', 'ø', 'å');
	    $store = array('&+198;', '&+216;', '&+197;');  //OBS! bytt ut + med #
	    $str = str_replace($smaa, $store, $str);
      }else{
	    $str = ucfirst($str);
      }
      return $str;
}

Hadde litt problemer med ØÆÅ i UTF8 jeg da, så brukte htmlentities, men det ser ut som forumet automatisk bytter ut mine entities i innlegget her med de faktiske bokstavene, så byttet ut hashen med en pluss sånn midlertidig.
Dersom man skulle trenge de faktiske bokstavene og ikke entities så bytter man bare ut &+198 (med # i stedet for +) til bokstaven Æ.

Brukes som vanlig:

PHP:
$foo = 'cola';
$foo = min_ucfirst($foo);
$bar = 'øl';
$bar = min_ucfirst($bar);
 

nukleuz

Medlem
Hei,

Tenker at dette ville vært en bedre løsning når regexp allerede er innvolvert: Pastebin &bull; uc_nor.php &bull; development.giaever.org

Som du ser er det to funksjoner der, du trenger i hovedsak kun den første for å gjøre det du ønsker, men jeg inkluderte en nordisk versjon av ucwords også.

Les kommentarer så ser du :)
 
Sist redigert:
du trenger i hovedsak kun den første for å gjøre det du ønsker
Hjertlig takk, jeg forsøkte den koden men fikk en feilmelding ???
Parse error: syntax error, unexpected T_FUNCTION, expecting ')'
PHP:
function ucfirst_nor ( $Str ) {

    // Use regexp from an array to replace with content inside the array,
    // for word that is not match we use built-in function ucfirst
    return ucfirst(
        preg_replace(
            array_map(
                function( $ArrVal ) {
                    return sprintf( '/^([%s])/u', $ArrVal );
                },
                array( 'æ', 'ø', 'å', 'ö', 'ä' )
            ),
            array( 'Æ', 'Ø', 'Å', 'Ö', 'Â' ),
            $Str
        )
    );

}
 

nukleuz

Medlem
Vil nok ikke definere versjon du bruker som utgått, men gammel.

Ser ut for at PHP5.2x ikke godtar at function blir nevnt, uten at det blir angitt et funksjonsnavn etterpå, til tross for at kode ikke blir kjørt. Jeg har kun nyeste versjon av PHP5.3 tilgjengelig, så får ikke testet kompatiblitet i 5.2x, eller eldre.

Du kan fjerne "phpversion() [...] function ( [...] } :" og bare ha med create_function. Jeg har ikke tilgang til PC, så får ikke redigert koden online akkurat nå.
 

adeneo

Medlem
Ville det ikke være enklere å bare bruk den funksjonen i innlegget mitt ovenfor?
Så vidt jeg kan se gjør nukleuz sin funksjon omtrent akkurat det samme, bytter ut fra ett array til et annet, og selve bruken er også lik.

Forskjellen er vel så vidt jeg kan se at det gjøres i en preg replace i stedet for å bruke if/else og string replace, slik at Nukleuz sin funksjon er noen millisekunder raskere ville jeg tro, uten at jeg har noe inngående kunnskap om PHP, men kan ikke tenke meg at det vil være noen merkbar forskjell med mindre man snakker om rimelig mange tusen ord som skal dyttes gjennom.
 

Pong

Jeg selger sʇɥƃıluʍop :)
Gå for den enkle versjonen til adeneo, ville jeg sagt.

Litt interessant i denne forbindelsen er hva slags kode man *bør* skrive. Jeg synes det avhenger nok av prosjektet art, levelengde og mer.
Jeg vet ikke om Nukleuz sin versjon er kjappere: preg_replace er en 'dyr' funksjon. Men nå er det dyreste med funksjoner vel den tid man trenger for å forstå den. array_map kan jeg ikke huske at jeg har brukt noen gang, så den måtte jeg lete fram. Lærerikt nok, men jeg er neppe den første eller den siste. Dyrt dermed ;)

Denne:
function mb_ucasefirst($str){
$str[0] = mb_strtoupper($str[0]);
return $str;
}
ville funkert fint også, og er rimelig selvforklarende.
 
Er ikke så veldig sprek på PHP, men kommer ikke på å ha lest om noe som gjør akkurat det du spør om, så jeg lagde en funksjon i et tappert forsøk på å løse det, aner ikke om det er riktig veien å gå?

PHP:
function min_ucfirst($str){
      $first = $str[0];
      if (preg_match('/[\'^æøå]/', $first)) {
	    $smaa  = array('æ', 'ø', 'å');
	    $store = array('&+198;', '&+216;', '&+197;');  //OBS! bytt ut + med #
	    $str = str_replace($smaa, $store, $str);
      }else{
	    $str = ucfirst($str);
      }
      return $str;
}

Fant en liten "bug" under test her, ikke noe alvorlig.
Men kan jo være greit å vite om.

Hansa øl ga Hansa øl
Men Ægir øl ga Ægir Øl, altså stor Ø

Ægir snadder øl ga Ægir snadder Øl, vittig ;)
 
Sist redigert:
Topp