2010-04-07 41 views
6

Tôi muốn viết một trình phân tích cú pháp (HTML) dựa trên máy trạng thái nhưng tôi nghi ngờ cách đọc/sử dụng đầu vào một cách hợp lý. Tôi quyết định nạp toàn bộ đầu vào vào một chuỗi và sau đó làm việc với nó như một mảng và giữ chỉ mục của nó như là vị trí phân tích cú pháp hiện tại.Phân tích chuỗi đa chuỗi trong PHP

Sẽ không có vấn đề gì với mã hóa một byte, nhưng trong mã hóa nhiều byte, mỗi giá trị không đại diện cho một ký tự, mà là một byte của ký tự.

Ví dụ:

$mb_string = 'žščř'; //4 multi-byte characters in UTF-8 

for($i=0; $i < 4; $i++) 
{ 
    echo $mb_string[$i], PHP_EOL; 
} 

Đầu ra:

Ĺ 
ž 
Ĺ 
Ą 

này có nghĩa là tôi không thể lặp qua các chuỗi trong một vòng lặp để kiểm tra nhân vật duy nhất, bởi vì tôi không bao giờ biết nếu tôi ở giữa một nhân vật hay không.

Vì vậy, câu hỏi là:

  • Làm thế nào để an toàn đa byte đọc một ký tự đơn từ một chuỗi theo một cách thân thiện hiệu suất?
  • Bạn nên làm việc với chuỗi vì nó là một mảng trong trường hợp này?
  • Bạn đọc đầu vào như thế nào?

Trả lời

2

http://php.net/mb_string là điều bạn đang tìm kiếm

  • nhân vật chỉ mb_substr từng người một
  • phải đến PHP6
  • gì đầu vào chính xác? Cách thông thường nói chung
+2

Lưu ý rằng phần ý kiến ​​cho 'mb_split' có bao gồm nhiều ví dụ về cách tách chuỗi nhiều byte thành một mảng ký tự - ví dụ: http://us2.php.net/manual/en/function.mb-split.php#80046 – Amber

+0

@Dav I don ' Tôi nghĩ anh ấy thực sự cần một mảng. –

+0

bởi đầu vào Tôi có nghĩa là mã HTML để phân tích cú pháp. Có lẽ có cách hoàn toàn khác nhau làm thế nào để sử dụng chuỗi với máy nhà nước mà tôi đang thiếu :-) ...nhưng mb_substr trông ổn (nếu tôi biết mã hóa chuỗi, điều này không rõ ràng) –

1
mb_internal_encoding("UTF-8"); 

$mb_string = 'žščř'; 

$l=mb_strlen($mb_string); 

for($i=0;$i<$l;$i++){ 
    print(mb_substr($mb_string,$i,1)."<br/>"); 
} 
0

Nếu không sử dụng mdb_relatedFunctions và với đa byte chuỗi mã hóa, bạn có thể sử dụng chức năng phụ chuỗi tiêu chuẩn mà đọc trong bội số của byte được sử dụng để mã hóa.

Ví dụ cho một mã UTF-8 (2 byte) chuỗi nếu bạn cần ký tự đầu tiên từ chuỗi

$string = 'žščř'; //4 multi-byte characters in UTF-8 

Bạn có để có được $ string [0] AND $ string [1] giá trị , do đó, bạn đang thực sự tìm kiếm chuỗi con giữa các chỉ mục 0 và 1 (đối với ký tự đầu tiên).

Lưu ý rằng $ string [0] hoặc $ string [N] sẽ tham khảo các (byte hoặc thứ N của chuỗi nhiều byte) đầu tiên

regards,

+0

Sẽ không khó để biết tôi phải đọc bao nhiêu byte? Đây là ví dụ tầm thường, nhưng nói chung tôi không biết ký tự nào có trên đầu vào (các ký tự UTF-8 có thể dài từ 1 đến 4 byte). –

+0

Có bạn phải xác định có bao nhiêu byte được sử dụng nhưng đó là câu trả lời có thể cung cấp cho bạn một số thông tin về cách sử dụng các hàm NON mb_related - và thao tác các chuỗi nhiều byte. Hi vọng bạn tìm được thứ hữu dụng. – Andreas

+0

Câu trả lời này gây hiểu lầm vì nó gợi ý rằng tất cả các ký tự UTF-8 dài 2 byte. Khi thực tế, độ dài byte phụ thuộc vào ký tự được biểu diễn. Như @PetrPeller đã lưu ý trong phần bình luận ở trên, các ký tự UTF-8 có thể chiếm ít nhất là 1 byte hoặc nhiều nhất là 4 byte. – Lee