2015-05-24 23 views
13

Tôi có một chuỗi kết hợp mà tôi muốn tách riêng.Cách tách một chuỗi (chuỗi tiếng Ả Rập)

Pattern của tôi: (ngôn ngữ tiếng Ả Rập, Bắt đầu từ bên phải):

str3[str2](str1) 

Ví dụ 1

Đối với đầu vào:

chuỗi = ت َ) [ع. ] (. مص م) راست کردن, معتدل کردن)

Tôi muốn đầu ra:

$str1='(تَ)'; 
$str2='[ ع . ]'; 
$str3='مص م .) راست کردن ، معتدل کردن)'; 

Ví dụ 2

Đối với đầu vào:

string = اِ تَ) (مص ل.) = اباته: شب را در جایی گذراندن)

Tôi muốn đầu ra:

$str1='(اِ تَ)'; 
$str2=''; 
$str3='مص ل .) = اباته : شب را در جایی گذراندن)'; 

Ví dụ 3

Đối với đầu vào:

chuỗi = [ع. ] (مص م.) راست کردن, معتدل کردن

Tôi muốn đầu ra:

$str1=''; 
$str2='[ ع . ]'; 
$str3='(مص م .) راست کردن ، معتدل کردن'; 

Làm thế nào tôi có thể làm điều đó?

+3

Đó là tiếng Ba Tư, không phải tiếng Ả Rập! – someOne

+1

@someOne bạn đúng, nhưng tôi siad tiếng Ả Rập bởi vì tôi nghĩ rằng nó là phổ biến hơn. – Shafizadeh

+0

Meh. Tôi biết làm thế nào để làm điều đó nhưng máy tính của tôi và ngôn ngữ Ba Tư không nhìn thấy mắt để mắt nó xuất hiện xD – icecub

Trả lời

5

Như tôi đã đề cập trong phần bình luận, ký tự đầu tiên rõ ràng (ngoài cùng bên phải) không phải là dấu ngoặc đơn mở (nó là ký tự cuối cùng), và lỗi ẩn này gây hiểu lầm). Tuy nhiên, đoạn mã sau sửa lỗi và xuất ra các chuỗi mong muốn.

<?php 
$arrStr = [ 
'تَ) [ ع . ] (مص م .) راست کردن ، معتدل کردن)', 
'اِ تَ) (مص ل .) = اباته : شب را در جایی گذراندن)', 
]; 
echo "<body style='direction: rtl !important;'>"; 
foreach($arrStr as $str) { 
    preg_match('~(.*?\))(?:\s)(\[.*?\])?(?:\s*?)(.*)~', $str, $matches); 
    $matches[1] = "(".$matches[1]; 
    $matches[3] = trim(substr($matches[3], 0, -1)); 
    echo "<pre>"; 
    for($i=1; $i<=3; $i++) 
     echo "$i: {$matches[$i]}<br />"; 
    echo "</pre><hr>"; 
} 
echo "</body>"; 
?> 

Kết quả:.(Xin lưu ý rằng các mục là theo hướng RTL đúng và sẽ được hiển thị một cách chính xác trên một môi trường RTL (họ không hành động làm sai lệch như là đúng trên một môi trường LTR))

1: (تَ) 
2: [ ع . ] 
3: (مص م .) راست کردن ، معتدل کردن 
_____________________________________________ 
1: (اِ تَ) 
2: 
3: (مص ل .) = اباته : شب را در جایی گذراندن 
_____________________________________________ 


PS: Vì vậy, đây là kịch bản mới của bạn: phần thứ nhất kèm theo trong () là tùy chọn, phần thứ hai kèm theo trong [] cũng là tùy chọn, nhưng phần thứ ba là bắt buộc; Theo ví dụ của bạn ở trên, phần thứ ba cũng có thể bắt đầu bằng (*), Do đó, và xem xét ví dụ về B (A)SỐ cách xác định xem ví dụ có ở định dạng có phần tùy chọn đầu tiên không. phần thứ 3 bắt buộc B hoặc ở định dạng không có bất kỳ phần tùy chọn nào nhưng có phần thứ ba bắt buộc là toàn bộ chuỗi, nếu đó không phải là mối quan tâm, bạn có thể sử dụng biểu thức chính quy ~(.*?\)\s)?(\[.*?\]\s)?(.*)~.

+0

Tôi có một questin, đó là trong mã của bạn: 'nếu str2 không tồn tại sau đó $ str2 = '';' ?? – Shafizadeh

+0

@Sajad Đó là trong phần '.. (\ [. *? \])? ..' một phần của cụm từ thông dụng. – someOne

+0

Tôi không bao giờ có thể hiểu ngôn ngữ regex. bạn có thể cho tôi biết, nếu tôi muốn thực hiện cùng một khả năng cho str1, tôi nên làm gì ?? – Shafizadeh

2

Bạn có thể đối sánh trên các tương đương unicode của các ký tự tiếng Ả Rập (cũng là Farsi). Đây là mã mà sẽ phù hợp với (تَ):

$str = تَ) [ ع . ] (مص م .) راست کردن ، معتدل کردن); 
preg_match('/^.*(\(\u064E\u062A\)).*$/iu', $str); 

Trong biểu thức trên \u064E là nguyên âm fetHa (mà đến trước) trong khi \u062A là phụ âm ta. Cờ \u yêu cầu PHP hoạt động ở chế độ unicode.

+0

Thành thật mà nói, tôi nghĩ rằng đây sẽ là giải pháp tốt nhất cho tất cả mọi người. Đó là ý tưởng tương tự tôi đã làm việc trên, nhưng không may tôi đã không thể nhận được tất cả các tương đương unicode vì pc của tôi chỉ đơn giản từ chối làm việc với tất cả các nhân vật (nó bắt đầu thay thế chúng với các ký tự enUS tiêu chuẩn). – icecub

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