teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2016/08/09 06:56

投稿

yambejp
yambejp

スコア117967

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

修正

2016/08/09 06:56

投稿

yambejp
yambejp

スコア117967

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](今日以降)";}