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

php: split string into 3 parts by two delimiters where the first and the last "delimiters" are letters or numbers respectively

任何想法如何将字符串分成 3 个部分,其中两个 "delimiters" 其中第一个和最后一个 "delimiters" 分别是字母或数字?

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

会这样拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");

$str = "Hi";

会这样拆分:

$arr=("","Hi", "");

$str = "Беларусь!";

会这样拆分:

$arr=("","Беларусь", "!");

$str = "!";

会这样拆分:

$arr=("!","", "");

$str = "";

会这样拆分:

$arr=("","", "");

$str = "ў55ЎW";

会这样拆分:

$arr=("","ў55ЎW", "");

表示returns一个由3个元素组成的数组(总是),第二个元素的第一个和最后一个符号是数字或latin/cyrillic字母,并且该数组的第一个和最后一个(第三个)元素绝对不包含数字和字母,并且该字符串的连接是源字符串

谢谢。

使用preg_matcharray_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",
"Беларусь!",
"!",
"",
"ў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");

}

其中:

  • \pL代表任何语言的任何字母
  • \pN代表任何语言的任何数字

输出:

'%@-H-e-l-l-o-7-9#$%'=> (1): '       %@-'   (2): 'H-e-l-l-o-7-9'    (3): '       #$%'
'          Hi'=> (1): '          '   (2): '     Hi'   (3): '          '
'Беларусь!'=> (1): '          ' (2): 'Беларусь' (3): '         !'
'              !'=> (1): '         !'   (2): '          '   (3): '          '
'               '=> (1): '          '   (2): '          '   (3): '          '
'        ў55ЎW'=> (1): '          ' (2): '   ў55ЎW' (3): '          '
'        $abc$$$'=> (1): '         $'   (2): '       abc'   (3): '       $$$'
'    асоба_'=> (1): '          '    (2): 'асоба'    (3): '         _'
'           34.5'=> (1): '          '   (2): '      34.5'   (3): '          '
'            #_!'=> (1): '       #_!'   (2): '          '   (3): '          '