Ответ 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)?(.*)~
как регулярное выражение.