2013-04-19 14 views
8

Mam dziwny problem i nie jestem pewien, jak rozwiązać ten problem. Chciałbym uzyskać pierwszą postać pola tekstowego, które otrzymuję z bazy danych. Z tą postacią zastosowałbym styl CSS, aby był duży.Zdobądź pierwszą postać ciągu, czyli francuski akcent

Jeśli spróbujesz to poniższy kod, można zrozumieć, co jest mój problem:

<?php 
$str_en = "I am a sentence."; 
echo $str_en[0]; 

echo "<br /><br />"; 

$str_fr = "À tous les jours je fais du PHP."; 
echo $str_fr[0]; 

echo "<br /><br />"; 

$str_fr = "Étais-tu ici?"; 
echo $str_fr[0]; 
?> 

powyższy kod wyjścia będzie:

I

Ã

Ã

Wygląda na to, że francuski bohater używa więcej niż jednego bajtu n ciąg. Problem polega na tym, że nie wszystkie moje zdania zaczynają się od francuskiego. Ktoś ma pomysł jak mogę mieć funkcję konwersji to:

<?php 
$str_fr = "Étais-tu ici?"; 
?> 

W tym

$str_fr = "<span class='firstletter'>É</span>tais-tu ici?"; 

A może istnieje lepszy sposób z CSS3 aby to zrobić.

+2

Oprócz konkretnej odpowiedzi przy użyciu funkcji PHP wielobajtowej ciągów, ty może również przeczytać [Joel "Absolutne minimum każdego programisty absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!)" (http://www.joelonsoftware.com/articles/Unicode.html). –

Odpowiedz

14

Patrz mb_substr (http://www.php.net/manual/en/function.mb-substr.php)

$first_char = mb_substr($string, 0, 1, 'utf-8'); // You may change the forth parameter according to your needed encoding. 

mb_substr repects kodowanie i zwraca wszystkie bajty reprezentujące pierwszego znaku tutaj.


CSS3 ma pseudo-klasę ::first-letter który wybiera tylko pierwszą literę.

Przykład:

Twój HTML jest:

<p id="french_text">Étais-tu ici?</p> 

Następnie można zająć go CSS3 przez:

p:first-letter { /* Your properties */ } 

(PS: W dzisiejszych czasach norma korzysta ::first-letter (podwójnym dwukropkiem zamiast pojedynczego podwójnego dwukropka), ale dla najlepszej zgodności wstecznej używaj tylko jednego podwójnego dwukropka)

+0

Zawsze należy wywoływać funkcje mb_string z kodowaniem określonym przez ciąg znaków. W przeciwnym razie wynik dla każdego, kto wypróbuje kod * jest prawdopodobnie uszkodzony *. – hakre

+0

@hakre Tak, ale nie znam kodowania, które jest tutaj używane. Dlatego dodałem tylko wstawiony komentarz. (Btw. W dzisiejszych czasach wewnętrzne kodowanie powinno być coraz bardziej utf-8 ...) – bwoebi

+0

@bwoebi można wywnioskować z jego wyników. UTF-8. Pierwszy bajt zakodowanych w UTF-8 "É" i "À", interpretowanych jako Windows-1252, pojawia się jako Ã. – Esailija

1

Wyjście powinno być:

I 

� 

� 

Można to naprawić wykonując

<?php 
header("Content-Type: text/html; charset=utf-8"); 

Obecnie źródło jest w UTF-8, ale przeglądarka interpretuje go jako Windows-1252.

Możesz następnie wykonać $first_char = mb_substr($string, 0, 1, "UTF-8");, aby dokończyć problem.

1

Lepiej zastosuj: pierwszą pseudo-klasę do elementu kontenera. Jest obsługiwany przez wszystkie główne przeglądarki i nie psuje kodu HTML.Na przykład, jeśli masz listę przedmiotów jak:

<ul> 
    <li>First db term</li> 
    <li>Second db term</li> 
</ul> 

zastosować CSS pierwszy się do każdego elementu li jak:

ul li:first-letter { font-size: 3em } 
Powiązane problemy