我有一个组合字符串,我想把它分开。
My Pattern: (阿拉伯语,从右开始):
str3[str2](str1)
示例1
输入:
string = تَ) [au:][مص] (مص .) راست کردن, معتدل کردن)
我想要输出:
$str1='(تَ)';
$str2='[ ع . ]';
$str3='مص م .) راست کردن ، معتدل کردن)';
示例2
输入:
字符串=اِتَ)(مصل)=اباته:شبرادرجاییگذراندن)
我想要输出:
$str1='(اِ تَ)';
$str2='';
$str3='مص ل .) = اباته : شب را در جایی گذراندن)';
示例3
输入:
string = [au:][مص] (مص .) راست کردن, معتدل کردن
我想要输出:
$str1='';
$str2='[ ع . ]';
$str3='(مص م .) راست کردن ، معتدل کردن';
我该怎么做呢?
正如我在评论中提到的,显然第一个字符(最右边)不是它应该是(实际上它是最后一个字符)的开括号,这个隐藏的错误导致误解(它只是视觉上正确)。但是,下面的代码纠正了错误并输出所需的字符串。
<?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)?(.*)~
作为正则表达式。可以在unicode中匹配阿拉伯语(也包括波斯语)字符。下面是匹配(تَ)
的代码:
$str = تَ) [ ع . ] (مص م .) راست کردن ، معتدل کردن);
preg_match('/^.*((u064Eu062A)).*$/iu', $str);
在上面的表达式中,u064E
是元音fetHa(出现在前面),而u062A
是辅音ta。u
标志告诉PHP在unicode模式下操作