使用 php 从字符串中提取值

extract value from string using php

我正在尝试使用 preg_match_all() 从以下行中提取开始日期 April 1, 2017,其中两个日期都是动态的。

for April 1, 2017 to April 30, 2017

$contents = "for April 1, 2017 to April 30, 2017";
if(preg_match_all('/for\s(.*)+\s(.*)+,\s(.*?)+ to\s[A-Za-z]+\s[1-9]+,\s[0-9]\s/', $contents, $matches)){
    print_r($matches);
}

如果您想匹配整个字符串并匹配 2 个类似模式的日期,您可以使用 2 个捕获组。

请注意,它不会验证日期本身。

\bfor\h+(\w+\h+\d{1,2},\h+\d{4})\h+to\h+((?1))\b

部分

  • \bfor\h+ 单词边界,匹配 for 和 1+ 个水平空白字符
  • ( 捕获 组 1
    • \w+\h+\d{1,2} 匹配 1+ 个单词字符、1+ 个水平空白字符和 1 或 2 个数字
    • ,\h+\d{4} 匹配逗号、1+ 个水平空白字符和 4 个数字
  • ) 关闭群组
  • \h+to\h+ 在 1+ 个水平空白字符之间匹配 to
  • ( 捕获 第 2 组
    • (?1) Subroutine call 抓取第1组(与第1组相同的pattern因为是同一个逻辑)
  • ) 关闭群组
  • \b 字边界

Regex demo

例如

$re = '/\bfor\h+(\w+\h+\d{1,2},\h+\d{4})\h+to\h+((?1))\b/';
$str = 'for April 1, 2017 to April 30, 2017';
preg_match_all($re, $str, $matches);
print_r($matches)

输出

Array
(
    [0] => Array
        (
            [0] => for April 1, 2017 to April 30, 2017
        )

    [1] => Array
        (
            [0] => April 1, 2017
        )

    [2] => Array
        (
            [0] => April 30, 2017
        )

)