我有一个我要分开的组合字符串。
我的模式:(阿拉伯语,从右侧开始):
str3[str2](str1)
示例1
输入:
string =Ê)[ع。 ](مصم。)راستکردن,معتدلکردن)
我想要输出:
$str1='(تَ)';
$str2='[ ع . ]';
$str3='مص م .) راست کردن ، معتدل کردن)';
示例2
输入:
string =اÊ)(مصل。)=اباته:شبرادرجاییگذراندن)
我想要输出:
$str1='(اِ تَ)';
$str2='';
$str3='مص ل .) = اباته : شب را در جایی گذراندن)';
示例3
输入:
string = [ع。 ](مصم。)راستکردن,معتدلکردن
我想要输出:
$str1='';
$str2='[ ع . ]';
$str3='(مص م .) راست کردن ، معتدل کردن';
我该怎么做?
答案 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模式运行。