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_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] => #$%
)
此方法适用于您提供的所有输入案例
这是完成这项工作的一种方法:
$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): ' '
任何想法如何将字符串分成 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_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] => #$%
)
此方法适用于您提供的所有输入案例
这是完成这项工作的一种方法:
$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): ' '