我有一个我要分开的组合字符串.
我的模式:(阿拉伯语,从右侧开始):
str3[str2](str1)
Run Code Online (Sandbox Code Playgroud)
例1
输入:
string =ت)[ع.](مصم.)راستکردن,معتدلکردن)
我想要输出:
$str1='(??)';
$str2='[ ? . ]';
$str3='?? ? .) ???? ???? ? ????? ????)';
Run Code Online (Sandbox Code Playgroud)
例2
输入:
string =اÊ)(مصل.)=اباته:شبرادرجاییگذراندن)
我想要输出:
$str1='(?? ??)';
$str2='';
$str3='?? ? .) = ????? : ?? ?? ?? ???? ???????)';
Run Code Online (Sandbox Code Playgroud)
例3
输入:
string = [ع.](مصم.)راستکردن,معتدلکردن
我想要输出:
$str1='';
$str2='[ ? . ]';
$str3='(?? ? .) ???? ???? ? ????? ????';
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
正如我在评论中提到的那样,显然第一个字符(最右边)不是它应该是的开括号(实际上它是最后一个字符),这个隐藏的错误会导致误解(它只是在视觉上正确).但是,以下代码更正错误并输出所需的字符串.
<?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>";
?>
Run Code Online (Sandbox Code Playgroud)
输出:( 请注意,条目处于正确的RTL方向,并且将在RTL环境中正确显示(它们不会在LTR环境中伪造为正确.))
1: (??)
2: [ ? . ]
3: (?? ? .) ???? ???? ? ????? ????
_____________________________________________
1: (?? ??)
2:
3: (?? ? .) = ????? : ?? ?? ?? ???? ???????
_____________________________________________
Run Code Online (Sandbox Code Playgroud)
()
是可选的,第二部分[]
是可选的,但第三部分是强制性的; 根据以上的例子中,第三部分也可以开始与一个(*)
,由于这一点,并考虑的例子中B (A)
有NO的方式来确定的例子是,其中具有任选的第一部分的格式(A)
,然后强制第三部分B
,或者是一种格式没有任何可选部分,但强制第三部分是整个字符串,如果不是问题,你可以使用它~(.*?\)\s)?(\[.*?\]\s)?(.*)~
作为正则表达式.