如何分隔字符串(阿拉伯字符串)

时间:2015-05-24 14:10:45

标签: php regex string

我有一个我要分开的组合字符串。

我的模式:阿拉伯语,从右侧开始)

str3[str2](str1)

示例1

输入:

  

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

我想要输出:

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

示例2

输入:

  

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

我想要输出:

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

示例3

输入:

  

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

我想要输出:

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

我该怎么做?

2 个答案:

答案 0 :(得分:5)

正如我在评论中提到的那样,显然是第一个字符(最右边)不是它应该是的开括号(实际上它是最后一个字符),这个隐藏的错误会导致误解(它只是在视觉上正确) 。但是,以下代码更正了错误并输出了所需的字符串。

<?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: (مص ل .) = اباته : شب را در جایی گذراندن
_____________________________________________

<小时/> PS:所以,这是您的新方案:()中的第一部分是可选的,[]中的第二部分也是可选的,但第三部分是强制性的;根据上面的示例,第三部分也可能以(*)开头,因此,并考虑B (A)的示例,有 NO 方式来确定是否为示例是一种格式,其中包含可选的第一部分(A),后跟强制性第三部分B,或者格式不具有任何可选部分,但强制第三部分是整个字符串,如果这不是问题,您可以使用~(.*?\)\s)?(\[.*?\]\s)?(.*)~作为正则表达式。

答案 1 :(得分:2)

您可以匹配阿拉伯语(也包括波斯语)字符的unicode等效项。以下是与(تَ)匹配的代码:

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

在上面的表达式中,\u064E是元音fetHa(首先出现),而\u062A是辅音ta。 \u标志告诉PHP以unicode模式运行。