Dev*_*Bob 17 php regex string preg-split
我试图在PHP中拆分一个字符串,如下所示:
ABCDE1234ABCD1234ABCDEF1234
Run Code Online (Sandbox Code Playgroud)
进入一个字符串数组,在这种情况下,看起来像这样:
ABCDE1234
ABCD1234
ABCDEF1234
Run Code Online (Sandbox Code Playgroud)
因此,模式是"未定义的字母数,然后是4位数,然后是未定义的字母数和4位数等."
我正在尝试使用preg_split分割字符串,如下所示:
$pattern = "#[0-9]{4}$#";
preg_split($pattern, $stringToSplit);
Run Code Online (Sandbox Code Playgroud)
它返回一个包含第一个元素中的完整字符串(不是拆分)的数组.
我猜这里的问题是我的正则表达式,因为我不完全理解如何使用它们,我不确定我是否正确使用它.
那么使用正确的正则表达式是什么?
mis*_*tin 16
你不想要preg_split,你想要preg_match_all:
$str = 'ABCDE1234ABCD1234ABCDEF1234';
preg_match_all('/[a-z]+[0-9]{4}/i', $str, $matches);
var_dump($matches);
Run Code Online (Sandbox Code Playgroud)
输出:
array(1) {
[0]=>
array(3) {
[0]=>
string(9) "ABCDE1234"
[1]=>
string(8) "ABCD1234"
[2]=>
string(10) "ABCDEF1234"
}
}
Run Code Online (Sandbox Code Playgroud)
PHP使用PCRE风格的正则表达式,让你做后卫.您可以使用它来查看您后面是否有4位数字.将它与前瞻相结合,看看你前面是否有一封信,你就明白了:
(?<=\d{4})(?=[a-z])
Run Code Online (Sandbox Code Playgroud)
注意Debuggex Demo页面上的虚线.这些是你想分开的点.
在PHP中,这将是:
var_dump(preg_split('/(?<=\d{4})(?=[a-z])/i', 'ABCDE1234ABCD1234ABCDEF1234'));
Run Code Online (Sandbox Code Playgroud)
使用对比原理:
\D+\d{4}
# requires at least one non digit
# followed by exactly four digits
Run Code Online (Sandbox Code Playgroud)
请参阅regex101.com上的演示.
PHP这将是:
<?php
$string = 'ABCDE1234ABCD1234ABCDEF1234';
$regex = '~\D+\d{4}~';
preg_match_all($regex, $string, $matches);
?>
Run Code Online (Sandbox Code Playgroud)
请参见上ideone.com演示.