我在PHP应用程序中列出了一些日期,结果如下:
April2016May2016June2016
等。
我正在尝试使用preg_split
格式化它们:
array('April 2016', 'May 2016', 'June 2016')
我使用在线正则表达式编辑器来确定如何检测4个连续数字,这是我已经走了多远:
注意:我也删除了所有空白区域 - 理想情况下,如果只有超过2个空格才会移除空白区域会更好,即hello world
不会被更改但hello world
会更改。< / p>
preg_split('/\d\d\d\d/g', preg_replace('!\s+!', '', $sidebar_contents));
使用上面的代码,我得到一个错误,表明g标识符无效,因为它不是preg_match_all
- 删除以下内容中的g结果:
感谢您的帮助!
答案 0 :(得分:2)
通过以下方式调用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);
模式意味着:
(\p{L}+)
- 匹配并捕获到第1组(通过$m[1]
匹配后可访问)一个或多个字母(\d+)
- 匹配并捕获到第2组(通过$m[2]
匹配后可访问)一个或多个数字。使用array_map
,我们只需将第1组和第2组中的值与空格连接即可。
替代:在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。
答案 1 :(得分:2)
您可以插入空格然后拆分:
<?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"
}
答案 2 :(得分:1)
试试这个:
$str = "April2016May2016June2016";
preg_match_all("/[a-z]+\\s\\d+/i", preg_replace("/([a-z]+)(\\d+)/i", "$1 $2", $str), $matches);
print_r($matches[0]);
输出:
Array
(
[0] => April 2016
[1] => May 2016
[2] => June 2016
)