不完全确定这是可能的,但希望会感到惊喜。
我有一个正则表达式,如下所示:
$pattern = '#post/date/(\d\d\d\d)-(\d\d)-(\d\d)#';
而且,我甚至有一个匹配它的字符串:
$string = 'post/date/2012-01-01';
当然,我事先并不知道确切的模式和字符串,但它们看起来像这样。
我需要得到一个如下所示的数组:
$groups = array('2012', '01', '01);
数组应包含与括号内的三个正则表达式组匹配的字符串部分。这可能吗?
答案 0 :(得分:4)
括号中的内容是子模式,您可以在应用正则表达式时获得每个子模式的结果。你可以像这样使用preg_match_all
$string = 'post/date/2012-01-01';
$pattern = '#post/date/(\d\d\d\d)-(\d\d)-(\d\d)#';
preg_match_all($pattern, $string, $matches);
$groups = array($matches[1][0], $matches[2][0],$matches[3][0]);
echo '<pre>';
print_r($groups);
echo '</pre>';
当然,这是一个只显示行为的示例,您需要首先检查字符串是否与模式匹配,如果匹配,则需要检查多少次... 你可以在这里看到这段代码:http://ideone.com/zVu75
答案 1 :(得分:2)
不是正则表达式,但会做你想要达到的目标
<?php
$string = 'post/date/2012-01-01';
$date= basename($string);
$array=explode('-',$date);
print_r($array);
?>
输出数组将如下所示
Array
(
[0] => 2012
[1] => 01
[2] => 01
)
答案 2 :(得分:1)
$str = 'post/date/2012-01-01';
preg_match('#post/date/(\d+)-(\d+)-(\d+)#', $str, $m);
array_shift($m);
$group = $m;
print_r($group);
输出
Array
(
[0] => 2012
[1] => 01
[2] => 01
)
答案 3 :(得分:1)
如果您正在寻找简明扼要的东西:
$matches = sscanf($string, '%*[^0-9]%d-%d-%d');
制作$matches
:
array(3) {
[0]=> int(2012)
[1]=> int(1)
[2]=> int(1)
}