3 回答
TA贡献1820条经验 获得超2个赞
考虑到示例字符串的格式,您可以使用重复组并使用 2 个捕获组,其中第一个包含月份名称,第二个是最后出现的 1 个或多个数字
^(?:[A-Za-z]+ \d+(?:-\d+)?(?:, \d+(?:-\d+)?)*, )*([A-Za-z]+)(?: \d+(?:-\d+)?,)* (?:\d+-)?(\d+)$
解释
^
字符串的开始(?:
非捕获组[A-Za-z]+ \d+
匹配 1+ a-zA-Z、空格和 1+ 数字(?:-\d+)?
可选择匹配连字符和 1+ 位数字(?:, \d+(?:-\d+)?)*,
重复 0+ 次匹配逗号、1+ 位数字和可选的连字符和 1+ 位数字)*
关闭非捕获组,重复 0+ 次(
捕获组 1[A-Za-z]+)(?: \d+(?:-\d+)?,
)*
关闭第 1 组,重复 0+ 次并匹配一个空格(?:\d+-)?
匹配可选的 1+ 位数字和连字符(\d+)
捕获第 2 组,匹配 1+ 个数字$
字符串结束
TA贡献1864条经验 获得超2个赞
一种不同的方法,不是更好或更坏(在我看来)是将字符串分成几部分,然后选择你需要的。
这样做的好处是将所有内容都放在数组中,因此您可以很容易地选择其他月份和日期。
$str = 'September 14-20, 26, 28-30, October 1-8, 10, 11, 15-20, 24, November 25, 28-30';
//Explode on [' ', ',', ', ', '-']
$arr = explode(" ", str_replace(['-', ', '], ' ', $str));
$months = preg_grep("/\D+/", $arr); // find the months
$LastMonth = end($months);
$LastDay = end($arr);
var_dump($LastMonth, $LastDay); //November, 30
https://3v4l.org/GiqtI
这也可以这样编写,您可以使用 substr 和 strpos 重新创建完整的月份字符串或选择范围 (28-30) 中的最后几天,或者像这样发布最后一个月的内容:
https://3v4l。组织/PBAXU
TA贡献1877条经验 获得超6个赞
我们可以preg_match在这里尝试使用:
$input = "September 14-20, 26, 28-30, October 1-8, 10, 11, 15-20, 24, November 25, 28-30";
preg_match('/.*\b([A-Za-z]+).*\b(\d+)$/', $input, $matches);
echo "month is: " . $matches[1] . "\n";
echo "last day is: " . $matches[2];
这打印:
month is: November
last day is: 30
- 3 回答
- 0 关注
- 152 浏览
添加回答
举报