正则表达式(特别是 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"
}
我在我的 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"
}