2016-08-03 12 views
0

的新行或開始我需要匹配一個郵戳,再看看後面,直到字符串的開始或新的生產線正面看,直到串

模式

$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

類似於['^([^ \ nb] *)(b)'](https://regex101.com/r/zM5sR3/1)?你能否確定要求? Lookbehinds不會消耗文本,儘管您可以使用它們捕獲子字符串。 –

+0

匹配模式比僅僅加工'b'更復雜,所以你的解決方案將不起作用 – clarkk

+2

你可以簡單地使用'r'(。*)b''第一組將是'b'之前的字符串直到換行,或者在多行標誌處使用'^(。*)b'。當你知道它時,甚至不需要第二組爲'b'字符。 – Kasramvd

回答

1

很明顯,你認爲加入回顧後,你可以捕捉到行的開始之日起你的主要$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+字符(儘可能少)(.*?)被捕獲到組1中,並且0+空白在該組外部與\s*匹配。

您可以進一步調整組編號/邊界以調整捕獲值的結果數組。