正则表达式(特别是 preg_split() PHP)

Regular Expressions (Specifically preg_split() PHP)

我在我的 PHP 应用程序中列出了一些日期,结果如下所示:

April2016May2016June2016

我正在尝试使用 preg_split 来格式化它们:

array('April 2016', 'May 2016', 'June 2016')

我使用在线正则表达式编辑器来确定如何检测 4 个连续的数字,这是我取得的进展:

注意:我还删除了所有白色 space - 理想情况下,如果它只删除白色 space 如果有超过 2 个 space 即 [=15],这会更好=] 不会改变,但 hello world 会。

preg_split('/\d\d\d\d/g', preg_replace('!\s+!', '', $sidebar_contents));

使用上面的方法,我收到一条错误消息,提示 g 标识符无效假设因为它不是 preg_match_all - 删除 g 结果如下:

感谢您的帮助!

试试这个:

$str = "April2016May2016June2016"; 
preg_match_all("/[a-z]+\s\d+/i", preg_replace("/([a-z]+)(\d+)/i", " ", $str), $matches);
print_r($matches[0]);

输出:

Array
(
    [0] => April 2016
    [1] => May 2016
    [2] => June 2016
)

这是一种通过调用 preg_match_all 并在之后使用 array_map 来实现您想要的方法:

preg_match_all('~(\p{L}+)(\d+)~', "April2016May2016June2016", $m);
$result = array_map(function($k, $v) { return $k . " " . $v; }, $m[1], $m[2]);
print_r($result);

参见regex demo and an IDEONE demo

该模式表示:

  • (\p{L}+) - 匹配并捕获到第 1 组(匹配后可通过 $m[1] 访问)一个或多个字母
  • (\d+) - 匹配并捕获到第 2 组(通过​​ $m[2] 匹配后可访问)一个或多个数字。

使用 array_map,我们只需将第 1 组和第 2 组的值与 space 连接起来。

Alternative: 在 preg_replace_callback 中填写生成的数组(仅通过一次!):

$result = array();
preg_replace_callback('~(\p{L}+)(\d+)~', function($m) use (&$result) {
    array_push($result, $m[1] . " " . $m[2]);
}, "April2016May2016June2016");
print_r($result);

参见IDEONE demo

可以插入space然后拆分:

<?php
$input = "April2016May2016June2016";
var_dump(preg_split('/(?<=\d)(?!\d|$)/i',
  preg_replace('/(?<!\d)(?=\d)/', ' ', $input)));
?>

输出:

array(3) {
  [0]=>
  string(10) "April 2016"
  [1]=>
  string(8) "May 2016"
  [2]=>
  string(9) "June 2016"
}