积极看待比赛背后,直到换行或开始弦

时间:2016-08-03 19:32:00

标签: php regex

我需要匹配一个日期戳,然后向后看,直到开始字符串或新行

图案

$date_day_pattern = '(?:0[1-9]|[12][0-9]|3[01])';
$date_month_pattern = '(?:0[1-9]|1[0-2])';
$date_year_pattern = '(?:[12][0-9]|20[12][0-9])';

$prefix_pattern = '(?<=[^\n]*)';
$date_pattern = "(?<!\d|\d )($date_day_pattern)[^\d\n]?($date_month_pattern)[^\d\n]?($date_year_pattern)(?!\d)";

preg_match("/$prefix_pattern$date_pattern/", $input, $matches);

输入

dksj dkk
49.. dk /ak 01-05-2012 hey
kdks

匹配

\\ 1 49.. dk /ak

\\ 2 01

\\ 3 05

\\ 4 2012

1 个答案:

答案 0 :(得分:1)

很明显,您认为添加一个lookbehind可以捕获主$date_pattern匹配日期之前的行的开头。

在PCRE正则表达式中无法使用未知宽度的后视镜。

相反,您可以捕获从行的开头(使用MULTILINE修饰符^)到延迟点匹配的第一个日期的所有文本。

以下两行更改了诀窍:

$prefix_pattern = '^(.*?)\s*';
...
preg_match("/$prefix_pattern$date_pattern/m", $input, $matches);

请参阅IDEONE demo

这样,$prefix_pattern等于^(.*?)\s*匹配行的开头(因为/m添加到preg_match模式),0 +字符除了a换行符尽可能少(.*?)被捕获到第1组中,0 +个空格在该组之外与\s*匹配。

您可以进一步调整组编号/边界以调整生成的捕获值数组。