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

时间:2016-04-20 09:11:28

标签: php regex wordpress preg-match preg-split

我在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结果:

enter image description here

感谢您的帮助!

3 个答案:

答案 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);

请参阅regex demoIDEONE demo

模式意味着:

  • (\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
)