任何想法如何将字符串分成3个部分,其中两个“分隔符”,其中第一个和最后一个“分隔符”分别是字母或数字?
$str = "%@-H-e-l-l-o-7-9#$%";
会像这样分开:
$arr=("%@-","H-e-l-l-o-7-9", "#$%");
和
$str = "Hi$73";
会像这样分开:
$arr=("","Hi$73", "");
和
$str = "Беларусь!";
会像这样分开:
$arr=("","Беларусь", "!");
和
$str = "!";
会像这样分开:
$arr=("!","", "");
和
$str = "";
会像这样分开:
$arr=("","", "");
和
$str = "ў55ЎW";
会像这样分开:
$arr=("","ў55ЎW", "");
表示它返回一个由3个元素组成的数组(总是),第二个元素的第一个和最后一个符号是数字或拉丁/西里尔字母,以及第一个和最后一个(第三个)元素数组中绝对没有数字和字母,并且该字符串的连接是源字符串
谢谢。
答案 0 :(得分:3)
使用preg_match
和array_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] => #$%
)
此方法适用于您提交的所有输入案例
答案 1 :(得分: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");
}
其中:
\pL
代表任何语言的任何字母\pN
代表任何语言的任何数字<强>输出:强>
'%@-H-e-l-l-o-7-9#$%'=> (1): ' %@-' (2): 'H-e-l-l-o-7-9' (3): ' #$%'
' Hi$73'=> (1): ' ' (2): ' Hi$73' (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): ' '