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)?(.*)~
.
To perski, nie arabski! – someOne
@someOne masz rację, ale siad arabski, ponieważ myślałem, że jest bardziej powszechne. – Shafizadeh
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