我需要匹配一个日期戳,然后向后看,直到开始字符串或新行
$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
答案 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*
匹配。
您可以进一步调整组编号/边界以调整生成的捕获值数组。