【问题标题】:preg_split in php to split string at the point which is preceded by digit and is followed by letters or blank spacephp 中的 preg_split 将字符串拆分到前面是数字,后面是字母或空格的位置
【发布时间】:2018-08-07 02:34:27
【问题描述】:

为了将我的字符串拆分为前面有数字,后面跟着字母的点:

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

任何帮助将不胜感激。

【问题讨论】:

  • 你必须为每个需要的字符串创建一个单独的`preg_split`
  • ...不可能@dean(对不起,我不能对你的评论投反对票)
  • @Rekha 这些值是较大字符串的一部分还是整个输入字符串?请说明$str 的变化情况。

标签: php regex date delimiter preg-split


【解决方案1】:

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

模式:~(?&lt;=[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";
}

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

【讨论】:

  • 我一直努力(并建议其他人)避免/尽量减少捕获组、环视、替代和惰性量词的使用,以提高性能。
【解决方案2】:

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

【讨论】:

  • 这个答案过于复杂,没有提供任何解释,并且具有不必要的转义。
  • 这可能很复杂,但它给出了他想要的输出
【解决方案3】:

一个简单的 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 个或多个空格、斜线或星号
  • 把剩下的都拿走 -> 第 2 组

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2016-11-27
    • 2019-06-11
    • 2022-06-25
    • 2012-02-19
    相关资源
    最近更新 更多