2013-04-19 39 views
8

Tôi có vấn đề lạ và tôi không chắc chắn cách giải quyết. Tôi muốn lấy ký tự đầu tiên của trường Văn bản mà tôi nhận được từ Cơ sở dữ liệu. Với nhân vật này, tôi sẽ áp dụng một phong cách CSS để làm cho nó lớn.Nhận ký tự đầu tiên của một chuỗi, đó là giọng Pháp

<?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]; 
?> 

Đoạn mã trên sẽ đầu ra::

tôi

Ã

Ã

Nếu bạn cố gắng mã sau này, bạn sẽ hiểu vấn đề của tôi là những gì

Có vẻ như một nhân vật người Pháp đang sử dụng nhiều hơn một byte n một chuỗi. Vấn đề là không phải tất cả câu của tôi đều bắt đầu bằng một nhân vật người Pháp. Bất cứ ai có một ý tưởng làm thế nào tôi có thể có một chức năng chuyển đổi này:

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

Để này

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

Hoặc có lẽ có một cách tốt hơn với CSS3 để làm điều này.

+2

Ngoài câu trả lời cụ thể sử dụng chức năng chuỗi PHP multibyte, bạn cũng có thể muốn đọc [Joel's "The Absolute Minimum Every Developer Developer hoàn toàn, tích cực phải biết về Unicode và bộ ký tự (Không có lý do!)"] (http://www.joelonsoftware.com/articles/Unicode.html). –

Trả lời

14

Xem cho 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 mã hóa và trả về tất cả các byte đại diện cho nhân vật đầu tiên ở đây.


CSS3 có pseudo-class ::first-letter chỉ chọn chữ cái đầu tiên.

Ví dụ:

HTML của bạn là:

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

Sau đó, bạn có thể giải quyết nó với CSS3 bởi:

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

(Ps: Ngày nay tiêu chuẩn được sử dụng ::first-letter (double ruột kết đôi thay vì một dấu hai chấm đơn), nhưng để khả năng tương thích ngược tốt nhất chỉ sử dụng một dấu hai chấm)

+0

Bạn luôn cần gọi các hàm mb_string với mã hóa được chỉ định mà chuỗi đang sử dụng. Nếu không, kết quả cho bất kỳ ai thử mã là * có khả năng bị hỏng *. – hakre

+0

@hakre Có, nhưng tôi không biết mã hóa đang được sử dụng ở đây. Vì vậy, tôi chỉ thêm một bình luận nội tuyến. (Btw. Ngày nay mã hóa nội bộ phải ngày càng nhiều hơn ...) – bwoebi

+0

@ bwoebi bạn có thể suy ra nó từ đầu ra của mình. UTF-8. Byte đầu tiên của UTF-8 được mã hóa là "É" và "À", khi được hiểu là Windows-1252, xuất hiện dưới dạng Ã. – Esailija

1

Kết quả cần phải có được:

I 

� 

� 

Bạn có thể khắc phục điều đó bằng cách làm

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

Hiện nay nguồn của bạn là trong UTF-8 nhưng trình duyệt diễn giải nó như Windows-1252.

Sau đó, bạn có thể thực hiện $first_char = mb_substr($string, 0, 1, "UTF-8"); để hoàn tất sự cố của mình.

1

Bạn nên áp dụng lớp học giả: chữ cái đầu tiên cho phần tử vùng chứa. Nó được hỗ trợ bởi tất cả các trình duyệt chính và không làm hỏng HTML của bạn.Ví dụ nếu bạn có một danh sách với các mặt hàng như:

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

Bạn áp dụng CSS đầu tiên chữ để mỗi phần tử li như:

ul li:first-letter { font-size: 3em } 
Các vấn đề liên quan