php:用两个分隔符将字符串分成3部分,其中第一个和最后一个“分隔符”分别是字母或数字

php:用两个分隔符将字符串分成3部分,其中第一个和最后一个“分隔符”分别是字母或数字,php,arrays,string,preg-match,preg-split,Php,Arrays,String,Preg Match,Preg Split,你知道如何将字符串分成三部分,其中第一个和最后一个分隔符分别是字母或数字,用两个分隔符分隔吗 $str = "%@-H-e-l-l-o-7-9#$%"; 将按如下方式拆分: $arr=("%@-","H-e-l-l-o-7-9", "#$%"); $arr=("","Hi$73", ""); $arr=("","Беларусь", "!"); $arr=("!","", ""); $arr=("","", ""); $arr=("","ў55ЎW", ""); 及 将按如下方式拆

你知道如何将字符串分成三部分,其中第一个和最后一个分隔符分别是字母或数字,用两个分隔符分隔吗

$str = "%@-H-e-l-l-o-7-9#$%";
将按如下方式拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");
$arr=("","Hi$73", "");
$arr=("","Беларусь", "!");
$arr=("!","", "");
$arr=("","", "");
$arr=("","ў55ЎW", "");

将按如下方式拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");
$arr=("","Hi$73", "");
$arr=("","Беларусь", "!");
$arr=("!","", "");
$arr=("","", "");
$arr=("","ў55ЎW", "");

将按如下方式拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");
$arr=("","Hi$73", "");
$arr=("","Беларусь", "!");
$arr=("!","", "");
$arr=("","", "");
$arr=("","ў55ЎW", "");

将按如下方式拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");
$arr=("","Hi$73", "");
$arr=("","Беларусь", "!");
$arr=("!","", "");
$arr=("","", "");
$arr=("","ў55ЎW", "");

将按如下方式拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");
$arr=("","Hi$73", "");
$arr=("","Беларусь", "!");
$arr=("!","", "");
$arr=("","", "");
$arr=("","ў55ЎW", "");

将按如下方式拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");
$arr=("","Hi$73", "");
$arr=("","Беларусь", "!");
$arr=("!","", "");
$arr=("","", "");
$arr=("","ў55ЎW", "");
这意味着它总是返回一个由3个元素组成的数组,第二个元素的第一个和最后一个符号是数字或拉丁/西里尔字母,该数组的第一个和最后第三个元素绝对不包含数字和字母,该字符串的连接就是源字符串

谢谢。

使用preg\u match和array\u slice函数的解决方案:

$str = "%@-H-e-l-l-o-7-9#$%";

preg_match('/^([^\w]*)(\w+.*\w+|\w)?([^\w]*)$/iu', $str, $matches);
$parts = array_slice($matches, 1);

print_r($parts);
输出:

Array
(
    [0] => %@-
    [1] => H-e-l-l-o-7-9
    [2] => #$%
)
此方法适用于所有呈现的输入案例

使用preg\u match和array\u slice函数的解决方案:

$str = "%@-H-e-l-l-o-7-9#$%";

preg_match('/^([^\w]*)(\w+.*\w+|\w)?([^\w]*)$/iu', $str, $matches);
$parts = array_slice($matches, 1);

print_r($parts);
输出:

Array
(
    [0] => %@-
    [1] => H-e-l-l-o-7-9
    [2] => #$%
)

此方法适用于所有呈现的输入案例

以下是一种方法:

$in = array(
"%@-H-e-l-l-o-7-9#$%",
"Hi$73",
"Беларусь!",
"!",
"",
"ў55ЎW",
'$abc$$$',
"асоба_",
"34.5",
'#_!',
);

foreach($in as $elem) {
    preg_match('/^([^\pL\pN]*)((?=[\pL\pN]|$)[^_]*(?<=[\pL\pN])|^)?([^\pL\pN]*)$/u', $elem, $m);
    printf("'%15s'%s'%10s'\t%s'%10s'\t%s'%10s'%s", "$elem","=> (1): ",$m[1],"(2): ",$m[2], "(3): ",$m[3],"\n");

}

以下是完成此项工作的方法:

$in = array(
"%@-H-e-l-l-o-7-9#$%",
"Hi$73",
"Беларусь!",
"!",
"",
"ў55ЎW",
'$abc$$$',
"асоба_",
"34.5",
'#_!',
);

foreach($in as $elem) {
    preg_match('/^([^\pL\pN]*)((?=[\pL\pN]|$)[^_]*(?<=[\pL\pN])|^)?([^\pL\pN]*)$/u', $elem, $m);
    printf("'%15s'%s'%10s'\t%s'%10s'\t%s'%10s'%s", "$elem","=> (1): ",$m[1],"(2): ",$m[2], "(3): ",$m[3],"\n");

}

您有数组[0]=>Hi$73[1]=>[2]=>Hi[3]=>$73。但是OP想要$arr=,嗨$73@是的,我已经编辑了代码,在字符类中插入了$。很抱歉接受为最好的ASN而不是你的。两个答案都很完美,但多亏@RomanPerekhrest,他在你的答案中发现了一个小错误。这是我知道如何标记一个被接受的答案的唯一原因。否则,两者都是完美的。非常感谢你们两位。@Haradzieniec:别担心,我没事。Roman Perekhrest已经在我面前回答了。@Haradzieniec:请看我的新编辑,它现在适用于任何测试用例,34.5、1070cбббб和!,最后这两个不适用于RomanPerekhrest的正则表达式。您有数组[0]=>Hi$73[1]=>[2]=>Hi[3]=>73美元。但是OP想要$arr=,嗨$73@是的,我已经编辑了代码,在字符类中插入了$。很抱歉接受为最好的ASN而不是你的。两个答案都很完美,但多亏@RomanPerekhrest,他在你的答案中发现了一个小错误。这是我知道如何标记一个被接受的答案的唯一原因。否则,两者都是完美的。非常感谢你们两位。@Haradzieniec:别担心,我没事。Roman Perekhrest已经在我面前回答了。@Haradzieniec:请看我的新编辑,它现在适用于任何测试用例,34.5、1070cбббб和!,这两个last不适用于RomanPerekhrest的正则表达式。似乎您的代码不适用于1个字母大小写。@Haradzieniec的空数组,请检查我的更新。它现在应该可以正常工作了看起来它可以正常工作了!我发现的唯一问题是uu下划线被视为字母,但这是因为\w是任何单词字符字母、数字、下划线。没有关于下划线的问题。这可能是一个单独的问题。非常感谢你的帮助!我真的很感激。非常感谢。似乎你的代码不适用于1个字母的大小写。@Haradzieniec的空数组,请检查我的更新。它现在应该可以正常工作了看起来它可以正常工作了!我发现的唯一问题是uu下划线被视为字母,但这是因为\w是任何单词字符字母、数字、下划线。没有关于下划线的问题。这可能是一个单独的问题。非常感谢你的帮助!我真的很感激。非常感谢。