回答編集履歴
2
追記
answer
CHANGED
@@ -17,4 +17,21 @@
|
|
17
17
|
$str=preg_replace_callback($pattern,$replacement,$str);
|
18
18
|
print $str;
|
19
19
|
?>
|
20
|
-
```
|
20
|
+
```
|
21
|
+
すみません、パターンが記載ミスしていましたので修正します
|
22
|
+
|
23
|
+
# 解説
|
24
|
+
$pattern="/(?<!\d)((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))(?!\d)/";
|
25
|
+
|
26
|
+
- (?<!\d):否定後読み
|
27
|
+
- (?!\d):否定先読み
|
28
|
+
|
29
|
+
それぞれ日付データの前後に数字がないことを保証します
|
30
|
+
- 1) ((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))を分解して
|
31
|
+
- 2)(\d{4}):年に当たる箇所は4桁の数字
|
32
|
+
- 3)([\.\/]):日付のセパレータはピリオド「.」かスラッシュ「/」
|
33
|
+
- 4)(\d{1,2}):月は1桁または2桁の数字
|
34
|
+
- 5)(?:\\3):前回出てきたのと同じセパレータ(3番めのカッコの中身)
|
35
|
+
- 6)(\d{1,2}):日には1桁または2桁の数字
|
36
|
+
|
37
|
+
あとは年と月と日のデータの組み合わせです
|
1
修正
answer
CHANGED
@@ -5,7 +5,10 @@
|
|
5
5
|
```PHP
|
6
6
|
<?PHP
|
7
7
|
$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";
|
8
|
+
/* 以下修正前
|
8
9
|
$pattern="/(?!=\d)((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))(?!\d)/";
|
10
|
+
*/
|
11
|
+
$pattern="/(?<!\d)((\d{4})([\.\/])(\d{1,2})(?:\\3)(\d{1,2}))(?!\d)/";
|
9
12
|
$replacement=function($a){
|
10
13
|
if(!checkdate($a[4],$a[5],$a[2])){ return "$a[1](不正な日付)";}
|
11
14
|
if(date("Y-m-d") < date("Y-m-d",strtotime("{$a[2]}/{$a[4]}/{$a[5]}"))){return "$a[1](今日以降)";}
|