2015-05-24 1 views
13

Mam połączony ciąg, który chcę oddzielić.Jak rozdzielić ciąg (ciąg arabski)

Moja Wzór: (język arabski, zaczyna się od prawej):

str3[str2](str1) 

Przykład 1

Na wejściu:

smyczkową = Ę) [Ú. ] (. مص م) راست کردن, معتدل کردن)

że chcemy wyjściowe:

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

Przykład 2

dla wejścia:

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

że chcemy wyjściowe:

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

Przykład 3

dla wejścia:

ciągu = [ع. ] (مص م.) راست کردن, معتدل کردن

Chcę wyjście:

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

W jaki sposób można to zrobić?

+3

To perski, nie arabski! – someOne

+1

@someOne masz rację, ale siad arabski, ponieważ myślałem, że jest bardziej powszechne. – Shafizadeh

+0

Meh. Wiem, jak to zrobić, ale mój komputer i język perski nie widzą się w oku, wygląda na to, że xD – icecub

Odpowiedz

5

Jak już wspomniałem w komentarzach, pozornie pierwsza postać (po prawej) nie jest otwartym nawiasem, jak powinna być (w rzeczywistości jest to ostatnia postać), a ten ukryty błąd powoduje nieporozumienia (jest po prostu poprawny wizualnie). Jednak poniższy kod koryguje błąd i wysyła żądane ciągi.

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

Wyjście.(Należy pamiętać, że wpisy są w prawidłowym kierunku RTL i będą wyświetlane poprawnie w środowisku RTL (nie działają one fałszować jako poprawne w środowisku LTR))

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


PS: Tak, tu jest twój nowy scenariusz: pierwsza część zamknięta w () jest opcjonalna druga część zamknięta w [] jest również opcjonalne, ale trzecia część jest obowiązkowa; Zgodnie z powyższymi przykładami, trzecia część może również rozpocząć się od (*), Z tego powodu i biorąc pod uwagę przykład B (A) istnieje sposób, aby ustalić, czy przykład jest w formacie, który ma opcjonalną pierwszą część (A), a następnie obowiązkowa trzecia część: B lub jest w formacie, w którym nie ma żadnej z opcjonalnych części, ale obowiązkową trzecią częścią jest cały ciąg znaków, jeśli nie ma to znaczenia, można użyć wyrażenia regularnego jako ~(.*?\)\s)?(\[.*?\]\s)?(.*)~.

+0

Mam questin, gdzie jest to w twoim kodzie: 'jeśli str2 nie istnieje, to $ str2 = '';' ?? – Shafizadeh

+0

@Sajad Jest to część wyrażenia regularnego wyrażenia ".. (\ [. *? \])? ..". – someOne

+0

Nigdy nie rozumiem języka regex. czy możesz mi powiedzieć, czy chcę wprowadzić tę samą możliwość dla str1, co powinienem zrobić? – Shafizadeh

2

Można dopasować na odpowiednikach Unicode znaków arabskich (również farsi). Oto kod, który będzie pasował do (تَ):

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

W powyższym wyrażeniu \u064E jest samogłoska fetHa (co nastąpi wcześniej), natomiast \u062A jest spółgłoska ta. Flaga \u mówi PHP, aby działał w trybie Unicode.

+0

Szczerze mówiąc, myślę, że byłoby to najlepsze rozwiązanie dla wszystkich. To jest ten sam pomysł, nad którym pracowałem, ale niestety nie byłem w stanie uzyskać wszystkich odpowiedników w Unicode, ponieważ mój komputer po prostu nie chce pracować ze wszystkimi znakami (zaczyna zastępować je standardowymi znakami enus). – icecub