preg_split in php 在数字前面和后面是字母或空格的点处拆分字符串 space

preg_split in php to split string at the point which is preceded by digit and is followed by letters or blank space

为了在前面是数字后面是字母的点处拆分我的字符串,如:

 $str = '12jan';

我用过

$arr = preg_split('/(?<=[0-9])(?=[a-z]+)/i',$str);  

它可以运行文件并提供所需的输出。我想更新它,以便它为类似字符串提供相同的输出。

$str='12 jan';
$str='12    jan';
$str='12/jan';
$str='12//jan';
$str='12/jan';
$str='12*/jan';
$str='12*//jan';

代码应该适用于上面给出的任何字符串,所以在一天结束时我有一个像

这样的数组
Array
(
    [0] => 12
    [1] => jan
)

我们将不胜感激。

如果您在评论中回答我的问题,这可能会得到优化。

模式:~(?<=[0-9])[*/ ]*(?=[a-z]+)~i

Demo

以上将匹配零个或多个 */ and/or space 个字符。


在您的输入字符串上,这将同样准确且更快:

模式:~\d+\K[^a-z]*~i
或者:~\d+\K[*/ ]*~(不需要 case-sensitive 模式修饰符)

Demo

以上将匹配紧跟在前导数字之后的零个或多个 non-alphabetical 个字符。


当然preg_split的表兄弟们也可以做得很好:

这里是a battery of PHP Demos.

$strings=['12jan','12 jan','12    jan','12/jan','12//jan','12/jan','12*/jan','12*//jan'];

foreach($strings as $string){
    var_export(preg_split('~(?<=[0-9])[*/ ]*(?=[a-z]+)~i',$string));
    echo "\n";
    var_export(preg_split('~\d+\K[*/ ]*~',$string));
    echo "\n";
    var_export(preg_match('~(\d+)[/* ]*([a-z]+)~i',$string,$out)?array_slice($out,1):'fail');
    echo "\n";
    var_export(preg_match('~(\d+)[/* ]*(.+)~',$string,$out)?array_slice($out,1):'fail');
    echo "\n";
    var_export(preg_match_all('~\d+|[a-z]+~i',$string,$out)?$out[0]:'fail');
    echo "\n---\n";
}

所有方法都提供相同的输出。

我已经用 preg_match 更新了你的代码 它给出的输出正是您所需要的

$str='12/jan';
preg_match('/^(\d*)[\*\s\/]*([a-z]{3})$/i', $str, $match);
print_r($match);

但是输出有点变化,会像下面这样

array(
  0 => '12/jan', 
  1 => '12', 
  2 => 'jan'
)

一个简单的 preg_match 正则表达式就可以做到:

foreach (['12 jan', '12    jan', '12/jan', '12//jan', '12/jan',
          '12*/jan', '12*//jan'] as $test)
{
        unset ($matches);
        if (preg_match("#^([0-9]+)[ /*]*(.*)#", $test, $matches)) {
                var_export( [$matches[1], $matches[2]] );
        }
        else {
                print "Failed for '$test'.\n";
        }
}

正则表达式是:

  • 从数字开始 -> 第 1 组
  • 有 0 个或多个 space、斜线或星号
  • 剩下的全部拿走 -> 第 2 组