繁体   English   中英

提取与正则表达式组匹配的字符串部分?

[英]Extract parts of string that match regular expression groups?

不完全确定这是可能的,但希望令人惊喜。

我有一个看起来像这样的正则表达式:

$pattern = '#post/date/(\d\d\d\d)-(\d\d)-(\d\d)#';

而且,我甚至有一个匹配它的字符串:

$string = 'post/date/2012-01-01';

当然,我事先并不知道确切的模式和字符串,但它们看起来像这样。

我需要最终得到一个如下所示的数组:

$groups = array('2012', '01', '01);

该数组应包含与括号内的三个正则表达式组匹配的字符串部分。 这可能吗?

括号中的那些东西是子模式,当你应用正则表达式时,你可以得到每个子模式的结果。 你可以像这样使用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

不是正则表达式,但会做你想要达到的目标

<?php
$string = 'post/date/2012-01-01';
$date= basename($string);
$array=explode('-',$date);
print_r($array);
?>

输出数组看起来像这样

Array
(
    [0] => 2012
    [1] => 01
    [2] => 01
)
$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
)

如果你正在寻找简洁的东西:

$matches = sscanf($string, '%*[^0-9]%d-%d-%d');

使$matches

array(3) {
  [0]=> int(2012)
  [1]=> int(1)
  [2]=> int(1)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM