Как отделить строку (арабская строка)

У меня есть комбинированная строка, которую я хочу разделить.

My Pattern: (арабский язык, начинается справа):

str3[str2](str1)

Пример 1

Для ввода:

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

Мне нужен вывод:

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

Пример 2

Для ввода:

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

Мне нужен вывод:

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

Пример 3

Для ввода:

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

Мне нужен вывод:

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

Как я могу это сделать?

Ответы

Ответ 1

Как я уже упоминал в комментариях, очевидно, что первый символ (самый правый) не является открытой скобкой, поскольку он должен быть (на самом деле это последний символ), и эта скрытая ошибка вызывает недоразумения (это просто визуально правильно), Однако следующий код исправляет ошибку и выводит нужные строки.

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

Вывод: (обратите внимание, что записи находятся в правильном направлении RTL и будут отображаться правильно в среде RTL (они не действуют как фальсифицирующие как правильные в среде LTR). )

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


P.S: Итак, вот ваш новый сценарий: первая часть, заключенная в () , является необязательной, вторая часть, заключенная в [], также является необязательной, но третья часть является обязательной; В соответствии с вашими примерами, третья часть также может начинаться с (*). Из-за этого и учитывая пример B (A) существует способ НЕТ, чтобы определить, является ли этот пример в формате который имеет необязательную первую часть (A), за которой следует обязательная третья часть B, или находится в формате, который не имеет какой-либо из необязательных частей, но имеет обязательную третью часть, являющуюся цельной строкой, если это не проблема вы можете использовать ~(.*?\)\s)?(\[.*?\]\s)?(.*)~ как регулярное выражение.

Ответ 2

Вы можете сопоставлять эквиваленты уникода арабских (также фарси) символов. Вот код, который будет соответствовать (تَ):

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

В приведенном выше выражении \u064E есть гласный fetHa (который входит первым), в то время как \u062A является согласным ta. Флаг \u указывает PHP работать в режиме Unicode.