2012-01-10 52 views
10

Làm cách nào để tách các ký tự Tamil trong một chuỗi?Cách tách các ký tự Tamil trong một chuỗi trong PHP

Khi tôi sử dụng preg_match_all('/./u', $str, $results),
Tôi nhận được các ký tự "த", "ம", "ி", "ழ" và "்".

Làm cách nào để nhận các ký tự kết hợp "த", "மி" và "ழ்"?

Trả lời

11

Tôi nghĩ bạn có thể sử dụng the grapheme_extract function để lặp qua các ký tự kết hợp (được gọi là "cụm đồ thị").

Ngoài ra, nếu bạn thích cách tiếp cận regex, tôi nghĩ bạn có thể sử dụng này:

preg_match_all('/\pL\pM*|./u', $str, $results) 

nơi \pL nghĩa là Unicode "chữ", và \pM nghĩa là Unicode "đánh dấu".

(Disclaimer: Tôi đã không kiểm tra một trong những phương pháp tiếp cận.)

+0

Tôi đã thử nghiệm và nó khớp chính xác với các ký tự. – Danack

+0

@ Danack57: Tuyệt vời, cảm ơn bạn rất nhiều. :-) – ruakh

+0

cảm ơn bạn. Nó hoạt động tốt. – priyacst

2

nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn đã có một chuỗi unicode chứa codepoints, và bạn muốn chuyển đổi này vào một mảng của graphames?

Tôi đang nghiên cứu phát triển thư viện Python nguồn mở để thực hiện các tác vụ như thế này cho một số Tamil Language website.

Tôi đã không sử dụng PHP trong một thời gian, vì vậy tôi sẽ đăng logic. Bạn có thể xem mã trong số amuthaa/TamilWord.py file's split_letters() function.

Như ruakh đã đề cập, biểu đồ Tamil được xây dựng dưới dạng điểm mã.

  • Các nguyên âm (உயிர் எழுத்து), aytham (ஆய்த எழுத்து - ஃ) và tất cả các kết hợp ((உயிர்-மெய் எழுத்து) trong 'a' cột (அ வரி - tức là க, ச, ட, த , ப, ற, ங, ஞ, ண, ந, ம, ன, ய, ர, ள, வ, ழ, ல), mỗi người sử dụng một điểm duy nhất.

  • Mỗi phụ âm được tạo thành từ hai điểm sau: một chữ cái kết hợp + pulli Ví dụ: ப் = ப + ்

  • Mọi kết hợp khác với kết hợp là als o tạo thành từ hai codepoints: bức thư một sự kết hợp + a đánh dấu: ví dụ பி = ப் + ி, தை = த் + ை

Vì vậy, nếu logic của bạn sẽ là một cái gì đó như thế này:

initialize an empty array 

for each codepoint in word: 

    if the codepoint is a vowel, a-combination or aytham, it is also its grapheme, so add it to the array 

    otherwise, the codepoint is a marking such as the pulli (i.e. ்) or one of the combination extensions (e.g. ி or ை), so append it to the end of the last element of the array 

Điều này tất nhiên giả định rằng chuỗi của bạn được hình thành tốt và bạn không có những thứ như hai dấu trong một hàng.

Đây là mã Python, trong trường hợp bạn thấy nó hữu ích. Nếu bạn muốn giúp chúng tôi chuyển mã này sang PHP, vui lòng cho tôi biết:

@staticmethod 
def split_letters(word=u''): 
    """ Returns the graphemes (i.e. the Tamil characters) in a given word as a list """ 

    # ensure that the word is a valid word 
    TamilWord.validate(word) 

    # list (which will be returned to user) 
    letters = [] 

    # a tuple of all combination endings and of all அ combinations 
    combination_endings = TamilLetter.get_combination_endings() 
    a_combinations = TamilLetter.get_combination_column(u'அ').values() 

    # loop through each codepoint in the input string 
    for codepoint in word: 

     # if codepoint is an அ combination, a vowel, aytham or a space, 
     # add it to the list 
     if codepoint in a_combinations or \ 
      TamilLetter.is_whitespace(codepoint) or \ 
      TamilLetter.is_vowel(codepoint) or \ 
      TamilLetter.is_aytham(codepoint): 

      letters.append(codepoint) 

     # if codepoint is a combination ending or a pulli ('்'), add it 
     # to the end of the previously-added codepoint 
     elif codepoint in combination_endings or \ 
      codepoint == TamilLetter.get_pulli(): 

      # ensure that at least one character already exists 
      if len(letters) > 0: 
       letters[-1] = letters[-1] + codepoint 

      # otherwise raise an Error. However, validate_word() 
      # should catch this 
      else: 
       raise ValueError("""%s cannot be first character of a word""" % (codepoint)) 

    return letters 
Các vấn đề liên quan