回答編集履歴

2

追記

2016/08/09 06:56

投稿

yambejp
yambejp

スコア114863

test CHANGED
@@ -37,3 +37,37 @@
37
37
  ?>
38
38
 
39
39
  ```
40
+
41
+ すみません、パターンが記載ミスしていましたので修正します
42
+
43
+
44
+
45
+ # 解説
46
+
47
+ $pattern="/(?<!\d)((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))(?!\d)/";
48
+
49
+
50
+
51
+ - (?<!\d):否定後読み
52
+
53
+ - (?!\d):否定先読み
54
+
55
+
56
+
57
+ それぞれ日付データの前後に数字がないことを保証します
58
+
59
+ - 1) ((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))を分解して
60
+
61
+ - 2)(\d{4}):年に当たる箇所は4桁の数字
62
+
63
+ - 3)([\.\/]):日付のセパレータはピリオド「.」かスラッシュ「/」
64
+
65
+ - 4)(\d{1,2}):月は1桁または2桁の数字
66
+
67
+ - 5)(?:\\3):前回出てきたのと同じセパレータ(3番めのカッコの中身)
68
+
69
+ - 6)(\d{1,2}):日には1桁または2桁の数字
70
+
71
+
72
+
73
+ あとは年と月と日のデータの組み合わせです

1

修正

2016/08/09 06:56

投稿

yambejp
yambejp

スコア114863

test CHANGED
@@ -12,7 +12,13 @@
12
12
 
13
13
  $str = "test2016/10/10 2016/08/111 12016/08/111 2550.10-39 2016/1/1 2016.2.2 2016/08/04 2016/08/05 2016.10.23 2016.10.33 2016/13/23test";
14
14
 
15
+ /* 以下修正前
16
+
15
17
  $pattern="/(?!=\d)((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))(?!\d)/";
18
+
19
+ */
20
+
21
+ $pattern="/(?<!\d)((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))(?!\d)/";
16
22
 
17
23
  $replacement=function($a){
18
24