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

13

我有一个字符串需要拆分。

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

str3[str2](str1)

例子 1

对于输入:

string = تَ) [ ع . ] (مص م .) راست کردن ، معتدل کردن)

我希望输出:

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

示例2

对于输入:

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

我希望输出:

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

示例3

对于输入:

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

我希望得到输出:

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

我该怎么做?


3
这是波斯语,不是阿拉伯语! - someOne
1
@someOne 你是对的,但是我说阿拉伯语是因为我认为它更常见。 - Shafizadeh
我知道如何做,但我的电脑和波斯语似乎不太合拍 xD - icecub
@icecub 难点在于从右到左的方向性。 - someOne
@Sajad:好的,你能给我提示如何分离第三个吗? - Sulthan Allaudeen
显示剩余10条评论
2个回答

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


P.S: 所以,这是你的新场景: 第一部分用括号()括起来是可选的,第二部分用方括号[]括起来也是可选的,但第三部分是必需的; 根据你上面的例子,第三部分还可能以 (*) 开头。因此,考虑到 B (A) 的例子,没有办法确定这个例子是以可选的第一部分(A)开头并接着必须的第三部分B的格式,还是不包含任何可选部分而必须的第三部分是整个字符串的格式。如果这不是问题,您可以使用~(.*?\)\s)?(\[.*?\]\s)?(.*)~作为正则表达式。


@Sajad 这是正则表达式中 ..(\[.*?\])?.. 部分的内容。 - someOne
我永远无法理解正则表达式语言。你能告诉我,如果我想为str1实现相同的可能性,我应该怎么做? - Shafizadeh
非常抱歉我再次提问。我想知道,如何通过正则表达式定义这个:if (\(.*?\)) was the first of string。你能告诉我吗? - Shafizadeh
感谢您的更新,但是str1不是可选的(在新的正则表达式和旧的正则表达式中都是如此),换句话说,如果str1不存在,则str1=str2str2=''。这意味着str1永远不会为空,除非str1=''str2='',那么str1将为空(当然也包括str2)。 - Shafizadeh
我的问题已经解决了,你真的帮了我很多。非常感谢! - Shafizadeh
显示剩余4条评论

2
你可以使用阿拉伯语(以及波斯语)字符的Unicode等价物进行匹配。以下是可以匹配 (تَ) 的代码:
$str = تَ) [ ع . ] (مص م .) راست کردن ، معتدل کردن);
preg_match('/^.*(\(\u064E\u062A\)).*$/iu', $str);

在上述表达式中,\u064E 是元音符号fetHa(排在第一位),而\u062A是辅音ta。 \u标志告诉PHP以unicode模式运行。

说实话,我认为这将是最好的解决方案。这是我正在研究的相同想法,但不幸的是,我无法获取所有Unicode等效项,因为我的电脑简单地拒绝使用所有字符(它开始用标准enUS字符替换它们)。 - icecub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接