我有一个字符串:
$Order_num = "0982asdlkj";
我该如何将其拆分成2个变量,一个包含数字元素,另一个包含字母元素?数字元素长度可以是1到4,字母元素填充其余部分,使得每个order_num总共有10个字符。
我已经找到了PHP的
explode
函数,但不知道如何在我的情况下使用它,因为数字的数量在1到4之间,而字母在其后是随机的,所以无法按特定字母拆分。我有一个字符串:
$Order_num = "0982asdlkj";
我该如何将其拆分成2个变量,一个包含数字元素,另一个包含字母元素?explode
函数,但不知道如何在我的情况下使用它,因为数字的数量在1到4之间,而字母在其后是随机的,所以无法按特定字母拆分。您可以使用 preg_split
和 lookahead 和 lookbehind 进行操作:
print_r(preg_split('#(?<=\d)(?=[a-z])#i', "0982asdlkj"));
Array
(
[0] => 0982
[1] => asdlkj
)
如果字母部分仅包含字母而没有数字,则此方法才有效。
更新:
为了澄清这里正在发生的事情:
正则表达式查看每个位置,如果该位置之前有数字((?<=\d)
) 并且 该位置之后是字母((?=[a-z])
),则匹配并在该位置拆分字符串。整个过程不区分大小写(i
)。
使用 preg_match() 函数和正则表达式 (\d+)([a-zA-Z]+)
。如果你想将数字限制在 1-4 个,字母限制在 6-9 个,可以改为 (\d+{1,4})([a-zA-Z]{6,9})
。
preg_match("/(\\d+)([a-zA-Z]+)/", "0982asdlkj", $matches);
print("Integer component: " . $matches[1] . "\n");
print("Letter component: " . $matches[2] . "\n");
输出:
Integer component: 0982
Letter component: asdlkj
$matches = array();
这行代码其实并不必要。即使没有匹配,preg_match
也会确保数组始终存在。 - codaddictarray()
,但我不喜欢不转义。 - moinudinpreg_split
函数,在数字和字母之间的位置拆分输入内容:list($num,$alpha) = preg_split('/(?<=\d)(?=[a-z]+)/i',$Order_num);
preg_match('/(\d{1,4})([a-z]+)/i', $str, $matches);
array_shift($matches);
list($num, $alpha) = $matches;
我更喜欢使用sscanf()
方法,因为它简洁明了,不需要正则表达式,可以将数字部分转换为整数类型,并且不会像preg_match()
一样生成不必要的完整字符串匹配。但是,%s
需要确保字符串中字母部分没有空格。
$Order_num = "0982asdlkj";
var_export (
sscanf($Order_num, '%d%s')
);
这也可以设置为声明单个变量。
sscanf($Order_num, '%d%s', $numbers, $letters)
preg_
函数,preg_split()
是最合适的选择,但我不会使用昂贵的环视。匹配数字,然后忘记它们(使用 \K
)。这将在不消耗任何字符的情况下拆分字符串。演示
var_export (
preg_split('/\d+\K/', $Order_num)
);
[$numbers, $letters] = preg_split('/\d+\K/', $Order_num);
除了这些单一功能的方法,还会有很多双重功能的方法,比如:
$numbers = rtrim($Order_num, 'a..z');
$letters = ltrim($Order_num, '0..9');
但我不会在专业脚本中使用它们,因为它们缺乏优雅。
看看这个
<?php
$Order_num = "0982asdlkj";
$split=split("[0-9]",$Order_num);
$alpha=$split[(sizeof($split))-1];
$number=explode($alpha, $Order_num);
echo "Alpha -".$alpha."<br>";
echo "Number-".$number[0];
?>
致敬
wazzy
split
已经被弃用,可以使用preg_split
代替...但是无论是split
还是preg_split
都可以正常工作。我反对没有解释就进行投票否决,而将您的PHP从古老版本升级到现代版本并再次运行不是一个解释。 - Felix Kling