php中的preg_split将字符串拆分为以数字开头的点,后跟字母或空格

时间:2018-02-27 12:31:46

标签: php regex date delimiter preg-split

为了将我的字符串拆分为以数字开头的字符串,后跟字母为:

$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
)

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

这样的数组
patindex()

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果您在评论中回答我的问题,可以对此进行优化。

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

Demo

上述内容将匹配零个或多个*/和/或空格字符。

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

模式:~\d+\K[^a-z]*~i
或:~\d+\K[*/ ]*~(不需要区分大小写的模式修饰符)

Demo

以上将匹配前导数字后面的零个或多个非字母字符。

当然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";
}

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

答案 1 :(得分:0)

我已使用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'
)

答案 2 :(得分:0)

一个简单的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";
        }
}

正则表达式是:

  • 从数字开始 - &gt;第1组
  • 有0或更多空格,斜线或星星
  • 取其余所有 - &gt;第2组